内存
指针和指针变量
指针和指针变量的区别
指针: 就是内存地址。
指针变量:用来存放内存地址的变量。
语法及初始化
问题:假设有一指针变量P,&P == &a?
指针的目标和解引用
指针的目标
指针的解应用
问题:如何把变量a的值 + 1?
1.int *p = &a;
声明p是指针变量。
2.*p:指针的目标(内容是数据)
解引用(间接访问)。
回顾问题:
以上:*p的作用可以等同于:
1.a
2.*(&a)
指针的赋值
赋值的形式
指针的大小
提示1:1字节 = 8byte;1byte = 一个高(or)低电平。
提示2:指针变量的大小和指针所指向内容的类型无关。
空指针
结论:
1.指针没有初始化(px):地址是随机的,有可能不报错。
2.指针如果没有初始化,应像上图中的(py)一样,0地址是一个特殊地址,在一般的操作系统中都是不可被访问的,如果C语言程序员不按规矩(不检查是否等于NULL就去解引用)写代码直接去解引用就一定会触发段错误。
野指针
怎么造成?
1.定义指针但是未初始化且后续未赋值,然后解引用。
2.指针越界访问。
3.指针指向的内存空间释放了。
上述变量 t 的空间被释放。
危害
如何避免野指针
指针没有明确的指向一个可用的内存空间(没有初始化,也没有赋值),然后去解引用。
1.定义指针时,同时初始化为NULL。
2.在指针使用之前,将其赋值绑定给一个可用地址空间。
3.在指针解引用之前,先去判断这个指针是不是NULL。
4.小心指针越界。
5.指针使用完后,将其赋值为空。
段错误
6.避免返回局部变量的地址