目录
一、指针的概念
- 指针就是个变量,用来存放地址,地址唯一标识一块内存空间。
- 指针的大小是固定的4/8个字节(32位平台/64位平台)。
- 指针是有类型,指针的类型决定了指针的+﹣整数的步长,指针解引用操作的时候的权限。
- 指针的运算。
1.1 什么是指针
指针理解的2个要点:
- 指针是内存中一个最小的单位的编号,也就是地址。
- 平时口语说的指针,通常指的是指针变量,是用来存放内存地址的变量。
1.2 关于内存
内存空间如何管理的呢?
切割成内存单位 -- 1byte(字节)
1.2.1 内存中的编号
内存会划分为一个个的内存单元(一个内存单元的大小:1byte)每个内存单元都有一个编号
1.2.2 电脑内存
32位的电脑内存4g
1.2.3 内存申请空间
当&a(取地址)时,得到的是首元素地址。
1.2.4 内存的数据表示
16进制表示10:a
1.3 关于地址
1.3.1 打印地址
用%p打印地址,以16进制表示
1.3.2 存储地址
注意:p1是指针,p2,p3是整形,p2,3前面加*(*p2,*p3)才是指针
详细
1.4 指针属性
&取地址,*通过地址再找回去,一来一去。
1.4.1 指针变量大小
建议用%zu——无符号整形打印
在32位机器(X86位环境)上打印都是4(字节)
在64位机器(X64位环境)上打印都是8(字节)
1.4.2 指针初始化
int *p = NULL;
1.4.3 指针类型
如果32位机器指针都是4字节,64位机器指针都是8字节,那么指针的类型还有必要吗?
char*类型可以存下int*类型的地址,但是使用方式不一样。当我们解引用把pc变量覆盖成0时,因为char*类型的原因,只处理了一个字节。
所以,指针类型决定了指针在被解引用的时候访问几个字节。
指针步长会根据指针类型变化。那如果int*和float*是不是可以通用啊?不能
可以看见存放的数值不一样。
int和float在内存的存储方式是有差异的。
总结指针类型的意义:
- 决定了指针在被解引用的时候访问几个字节。
- 决定了指针的步长。
1.5 野指针
概念:
野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
1.5.1 野指针成因
1.指针未初始化
2.*p访问了不属于我们的地址。
指针越界访问
3.指针指向的空间释放
变量a是局部变量,出了局部范围就销毁了。但是指针变量p存储了已经销毁了的变量a的空间,如果再解引用使用这空间就是非法访问了。
1.5.2 避免野指针
int* p = NULL;
0地址不能访问。
不是空指针时,解引用。
指针初始化
- 小心指针越界
- 指针指向空间释放及时指NULL
- 避免返回局部变量的地址
- 指针使用之前检查有效性
1.6 指针运算
- 指针 +- 整数
- 指针