目录
指针
什么是指针:指针是一种数据类型(无符号整数,代表了内存编号),使用它可以定义指针变量。简称指针
指针变量的取值范围:0-4G(32个1)。
什么情况下使用指针:1、函数之间共享变量(全局变量会有命名冲突,不会被释放,浪费内存)。
2、优化传递效率
因为C语言采用的是值传递(内存拷贝),会随着变量字节数的增加而降低运行效率,而传递变量的地址,永远只拷贝4||8字节
但使用指针,变量的值就可能会被修改,可以配合const进行保护。
void func(const int * p)
3、配合堆内存:堆内存无法取名字
如何使用指针:
定义:类型 *变量名_p;
1、与普通变量一样,默认值不确定,为了安全一般初始化为NULL
2、一个*只能定义一个指针变量。
int *p1,*p2;
3、指针变量与普通变量的用法不同,为了避免混用,一般从名字上加以区分。
4、指针变量的类型决定了解引用时访问的字节数。
赋值:变量名_p=地址
1、注意地址的类型
2、void*可以与任意类型的指针进行自动转换(C++中不可以)。
3、要保障地址与物理内存有对应关系(映射过),否则会有段错误。
解引用:*p;
根据指针变量中存储的内存编号,而访问内存中的数据。
这个过程可能会有段错误,但这是由于赋值了有问题的地址。
使用指针要注意的问题:
1、野指针
指向的目标不确定,解引用时不一定会出错。但未知的危险才是最可怕的
而且野指针一旦产生就无法分辨出来,而预防的方法就是不制造野指针。
(1)、定义指针时一定要初始化。
(2)、指向的目标被释放后,一定要及时置空。
(3)、不要指向随时可能被释放的目标。
2、空指针:指针变量的值等于NULL,对这个地址解引用访问时一定会产生段错误。
因为它存储的是操作系统重启时所需要的数据。
而预防的方法就是解引用前进行判断(指的是来历不明的指针) if(NULL == p)。
指针的运算:
指针+或/或-整数=指针+或/或-(宽度)*整数
指针-指针 = (指针-指针)/宽度
指针与数组名:
1、数组名就是一个特殊的地址。它就代表数组第一个元素的首地址。但是也能当指针使用。
arr[i]<=>*(地址+i);
因此指针也能使用[ ]运算符。
2、指针与目标内存是指向关系,而数组名是对应关系
3、数组当函数的参数就蜕变成了指针变量,长度丢失,安全性也下降。
void func(int* const arr,size_t len);
指针与const的配合使用:
const int* p;
int const * p;
int * const p;
const int * const;
int const * const p;
指针的高级应用:
指针数组:把无序的离散的数据,归纳到一起。
数组指针:专门指向数组的指针
二级指针:指向指针的指针
函数指针:指向函数的指针