iOS开发-前言篇C-指针以、结构体指针、作用域
2015-11-08 17:33
295 查看
1:指针
指针变量的定义和使用
存放内存地址的变量 指针变量所占的字节数只和操作系统有关
int *p = NULL; 初始值NULL恒为0
变量类型 : 整型指针
指针变量也是变量。它可以储存地址,它本身也有自己的地址
取址运算符
&
取值运算符
*
指针的算数运算(加,减)
int *p = &a;
p++; // 向高位移动四个字节
p—; // 向低位移动四个字节
指针类型决定移动几个字节
指针变量的赋值意味着重指向(重新被定值)
数据的存储’
字节是最小的存储单元 一个字节称为一个存储单元,不同数据类型所占用的存储单元不等
为了正确访问内存单元,每个内存单元都有一个编号,内存单位的编号称作地址
内存单元中的内容才是我们关注的数据
访问方式
数据访问一般分为直接访问和间接访问
直接访问 例如 a=20;
间接访问 通过内存单元编号以及数据所占字节数访问内存中的数据
间接访问在程序随处可见,指针就是间接访问方式
*p {指针变量取值时,访问内存地址为p的存储区域
指针变量定义时,只是起到修饰作用 告诉编译器P是指针
数组的数组名是数组元素的首地址
*(p+2) = 6 数组里第三个元素会发生变化
指针可以当数组名使用
P[1] = 3;
数组名不可以++ 指针可以++
数值名是常量地址 不能重指向,指针可以 不能用指针算出数组元素的个数
恒等于a[1]
恒等于*(p+1)
恒等于*(a+1)
存放指针的数组成为指针数组
指针与函数
数据类型 函数名(参数列表);
数据类型 (*函数指针变量名)(参数列表);
2:结构体指针
指向结构体变量的指针叫结构体指针
typedef struct student Stu;
Stu stu1 = {0};
Stu *p = &stu1;
(*p).sex = ‘m’
p->sex = ‘m’,
*p 对指针变量取值后是结构体变量 .sex是访问成员变量,指针可以直接访问 即 p->sex = ‘m'
只有把结构体变量地址先赋值给结构体变量指针变量,结构体指针变量才可以获取结构体变量的成员变量存储的内容
结构体数组与指针的关系
结构体数组的数组名是一个结构体指针常量
Stu stus[3] = {0};
Stu *p = &stus;
(p+i)->num
结构体指针变量是通过指向符来访问结构体变量的成员变量的
void printStudent(Stu *pstu,int count);
函数操作结构体数组,需要传入首地址和元素个数
预编译指令
步骤 写代码 - 连接 - 编译 - 打包
在编译前开始预编译
宏名命名规则
纯大写 或者 k+驼峰
普通宏
#define PI 3.1415
作用 按不同的条件,编译笔筒的代码
条件编译有三种
#ifdef 标示符
代码段1
#else
代码段2
#endif
如果标示符被#define过,编译器编译代码段1,否者编译代码段2
#ifndef 标示符
代码段1
#else
代码段2
#endif
如果标示符未被#define编译器编译代码段1,否者编译器代码
3:作用域{
局部变量
}
不被计算机应用程序主动收回的存储空间,为了提高计算机的运行效率
储存区的划分
所有在(栈区)都是有计算机主动分配释放的区域 函数左大括号开始,右大括号结束后收回 int a = 3;
堆区 计算机程序编写人员主动分配和主动收回的 malloc(255)
静态区 不受计算机和程序员的管辖 static float h = 1.36;
常量区 不受计算机和程序员的管辖 “lanou”
代码区 计算机在编译完成后,一条条实现的指令 void func(){…}
从上到下 内存地址由高到低
单项值传递(只能向下传)
字符数组最后一位是’\0’ 就是字符串变量
字符串常量不能更改
如 char *string = “iphone”; string[0] = ‘a’; 运行崩溃 ,因为*string 后面的是一个常量
字符数组变量可以改
如 char string[] = “iphone”; string[0] = ‘a’; 可以更改成功
char *string = {‘i’,’p’,’\n’};
string[0] = ‘a’;
静态储存区
static int a = 5;
static char string[255];
只初始化一次
如果初始值没给,默认值为0
只有程序退出才释放
将变量定义的类型前加static 则该变量存储在静态储存区
堆区
malloc 等内存分配函数的内存 手动分配,手动释放
所有的语句编译后会生成cpu指令存储在代码区
堆内存分配函数
void *malloc(unsigned int size//需要分配的字节长度);返回的分配完的内存的首地址
返回值是不确定类型的指针变量
其他内存分配函数
void * calloc(unsigned n,unsigned size); calloc 复制的意思
分配n个size大小的空间。并且把该内存上的所有字节清零
void * realloc(void*p,unsigned newsize); realloc 从新分配
按给定的地址以及给定的大小从新分配
内存操作函数
将字符串转换成整型,然后进行计算 char *s = “1234”; int value = atoi(s);
初始化内存
void *memset(void *s,int c, size_t n) 从s指向的内存开始初始化n个字节的内容为c
字符串拷贝
void *memcpy(void *dest,const void*source,size_t n); 从source 指向的内存开始拷贝到dest 拷贝n个字节
内存比较
int memcmp(const void *buf1,const void *buf2,unsigned int count)
sizeof 不是 一个函数,是一个运算符 -> 指针运算符 应用程序的最小单位是函数
指针变量的定义和使用
存放内存地址的变量 指针变量所占的字节数只和操作系统有关
int *p = NULL; 初始值NULL恒为0
变量类型 : 整型指针
指针变量也是变量。它可以储存地址,它本身也有自己的地址
取址运算符
&
取值运算符
*
指针的算数运算(加,减)
int *p = &a;
p++; // 向高位移动四个字节
p—; // 向低位移动四个字节
指针类型决定移动几个字节
指针变量的赋值意味着重指向(重新被定值)
数据的存储’
字节是最小的存储单元 一个字节称为一个存储单元,不同数据类型所占用的存储单元不等
为了正确访问内存单元,每个内存单元都有一个编号,内存单位的编号称作地址
内存单元中的内容才是我们关注的数据
访问方式
数据访问一般分为直接访问和间接访问
直接访问 例如 a=20;
间接访问 通过内存单元编号以及数据所占字节数访问内存中的数据
间接访问在程序随处可见,指针就是间接访问方式
*p {指针变量取值时,访问内存地址为p的存储区域
指针变量定义时,只是起到修饰作用 告诉编译器P是指针
数组的数组名是数组元素的首地址
*(p+2) = 6 数组里第三个元素会发生变化
指针可以当数组名使用
P[1] = 3;
数组名不可以++ 指针可以++
数值名是常量地址 不能重指向,指针可以 不能用指针算出数组元素的个数
恒等于a[1]
恒等于*(p+1)
恒等于*(a+1)
存放指针的数组成为指针数组
指针与函数
数据类型 函数名(参数列表);
数据类型 (*函数指针变量名)(参数列表);
2:结构体指针
指向结构体变量的指针叫结构体指针
typedef struct student Stu;
Stu stu1 = {0};
Stu *p = &stu1;
(*p).sex = ‘m’
p->sex = ‘m’,
*p 对指针变量取值后是结构体变量 .sex是访问成员变量,指针可以直接访问 即 p->sex = ‘m'
只有把结构体变量地址先赋值给结构体变量指针变量,结构体指针变量才可以获取结构体变量的成员变量存储的内容
结构体数组与指针的关系
结构体数组的数组名是一个结构体指针常量
Stu stus[3] = {0};
Stu *p = &stus;
(p+i)->num
结构体指针变量是通过指向符来访问结构体变量的成员变量的
void printStudent(Stu *pstu,int count);
函数操作结构体数组,需要传入首地址和元素个数
预编译指令
步骤 写代码 - 连接 - 编译 - 打包
在编译前开始预编译
宏名命名规则
纯大写 或者 k+驼峰
普通宏
#define PI 3.1415
作用 按不同的条件,编译笔筒的代码
条件编译有三种
#ifdef 标示符
代码段1
#else
代码段2
#endif
如果标示符被#define过,编译器编译代码段1,否者编译代码段2
#ifndef 标示符
代码段1
#else
代码段2
#endif
如果标示符未被#define编译器编译代码段1,否者编译器代码
3:作用域{
局部变量
}
不被计算机应用程序主动收回的存储空间,为了提高计算机的运行效率
储存区的划分
所有在(栈区)都是有计算机主动分配释放的区域 函数左大括号开始,右大括号结束后收回 int a = 3;
堆区 计算机程序编写人员主动分配和主动收回的 malloc(255)
静态区 不受计算机和程序员的管辖 static float h = 1.36;
常量区 不受计算机和程序员的管辖 “lanou”
代码区 计算机在编译完成后,一条条实现的指令 void func(){…}
从上到下 内存地址由高到低
单项值传递(只能向下传)
字符数组最后一位是’\0’ 就是字符串变量
字符串常量不能更改
如 char *string = “iphone”; string[0] = ‘a’; 运行崩溃 ,因为*string 后面的是一个常量
字符数组变量可以改
如 char string[] = “iphone”; string[0] = ‘a’; 可以更改成功
char *string = {‘i’,’p’,’\n’};
string[0] = ‘a’;
静态储存区
static int a = 5;
static char string[255];
只初始化一次
如果初始值没给,默认值为0
只有程序退出才释放
将变量定义的类型前加static 则该变量存储在静态储存区
堆区
malloc 等内存分配函数的内存 手动分配,手动释放
所有的语句编译后会生成cpu指令存储在代码区
堆内存分配函数
void *malloc(unsigned int size//需要分配的字节长度);返回的分配完的内存的首地址
返回值是不确定类型的指针变量
其他内存分配函数
void * calloc(unsigned n,unsigned size); calloc 复制的意思
分配n个size大小的空间。并且把该内存上的所有字节清零
void * realloc(void*p,unsigned newsize); realloc 从新分配
按给定的地址以及给定的大小从新分配
内存操作函数
将字符串转换成整型,然后进行计算 char *s = “1234”; int value = atoi(s);
初始化内存
void *memset(void *s,int c, size_t n) 从s指向的内存开始初始化n个字节的内容为c
字符串拷贝
void *memcpy(void *dest,const void*source,size_t n); 从source 指向的内存开始拷贝到dest 拷贝n个字节
内存比较
int memcmp(const void *buf1,const void *buf2,unsigned int count)
sizeof 不是 一个函数,是一个运算符 -> 指针运算符 应用程序的最小单位是函数
相关文章推荐
- iOS开发-前言篇C-结构体
- iOS开发-前言篇C-函数
- ios中AFN的应用
- ios开发-OC的学习
- IOS毛玻璃效果
- iOS开发计算文本尺寸
- nagios配置过程详解
- Nagios部署配置实战
- IOS中的instancetype和id关键字
- ios提交代码到远程仓库
- iOS开发27-iOS 可视化编程-Size Classes
- ios tableView那些事 (十)设置 tableview 的分割线
- IOS-图片操作集合
- ios数据解析
- iOS 之使用CAShapeLayer中的CAGradientLayer实现圆环的颜色渐变
- iOS巅峰之深拷贝和浅拷贝区别
- iOS 手势识别器
- ios 开发 OC编程 类的扩展 协议 延展和 类目
- ios 开发 OC编程 内存管理
- ios 开发 OC编程 块语法bolck的一些应用