您的位置:首页 > 移动开发 > IOS开发

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 不是 一个函数,是一个运算符 -> 指针运算符 应用程序的最小单位是函数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: