一、何为指针
指针就是变量,变量里面存的是地址,因此,可以说指针就是地址。
总结:
1、一个小的内存单元是一个字节。
2、指针是用来存放地址的,地址是唯一标识一块地址空间的。
3、指针的大小在32位平台是4个字节,在64位平台是8个字节。
二、指针和指针类型的意义
问题:
这个十六进制位能否存放在4个字节的 a 变量里面?
原因:一个十六进制位是4个二进制位-----------16=2^4 (注意是幂!!!),所以两个十六进制位就是8个二进制位,又因为一个二进制位==一个比特位,即8个比特就是一个字节,总共是4个字节,即可以存储
指针类型决定了指针进行解引用操作的时候,能够访问空间的大小!
举例:
int* 指针能够访问4个字节的空间,而 char* 指针只能访问1个字节的空间。
区分指针类型的两个意义:
1、指针的类型决定了对指针进行解引用操作时,有多大的权限(能够操作几个字节),比如 char* 的解引用操作之能操作1个字节, int* 的解引用操作能够操作4个字节。2、指针类型决定了:指针走一步能走多远(指针的步长)。----------------------指针加减整数
指针类型的意义:
2、根据具体的需求,设置合理的指针、指针变量!
三、野指针
原因一:未被初始化的指针。
举例:
、
明确概念:局部变量不初始化,默认是随机值。
局部的指针变量不初始化,就被初始化随机值。
原因二:指针越界访问
这两种表达方式一样, *p++ ,表示先使用,后加加。
即先让 i 的值赋给 *p,再让p 加加
原因三:指针指向的空间被释放
局部变量在一个范围内被创建,出这个范围就会被销毁(意味着这一部分的内存空间就会还给系统,不再属于我们了)
四、如何规避野指针
1、指针初始化
当我们真的真的不知道给指针初始化声明值时,令他等于空指针(NULL),相当于 int a =0;
2、小心指针越界
3、指针指向空间释放使之变成空指针
当我们不使用 pa 时,令其等于NULL,以防万一。
因此,我们在使用之前需要判断指针是否等于空指针。!
五、指针的运算
1、指针+- 整数
这个代码用到了指针+-整数,指针的关系运算
随着数组下标的增加,其地址也对应增加
2、两个指针相加减
指针减去指针:表示两者之间相差的元素个数(前提是两者必须指向同一块空间)
两个指针相减,表示两者之间相差的个数!!!