iOS开发-前言篇C-指针以、结构体指针、作用域

来源:互联网 发布:淘宝v2贷款怎么搞 编辑:程序博客网 时间:2024/06/06 03:35

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 不是 一个函数,是一个运算符  -> 指针运算符  应用程序的最小单位是函数


1 0