1.什么是指针
- 指针是内存中一个最小单元的编号,也就是地址。(内存的最小单位为1byte)
- 平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量。
- 指针的大小在32位平台是4个字节,在64位平台是8个字节。
2.指针和指针类型
2.1 指针解引用
int类型修改4个字节
char类型修改1个字节
2.2 指针+1
int类型加了4个字节,char类型增加了1个字节。
- 指针类型决定了指针在被解引用的时候访问几个字节
如果是int*的指针,解引用访问4个字节,如果是char*的指针,解引用访问1个字节。
- 指针的类型决定了指针+-1操作的时候,跳过几个字节
3. 野指针
概念: 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
3.1 野指针成因
- 指针未初始化
- 指针越界访问
当指针指向的范围超出数组arr的范围时,P就是野指针
- 指针指向的空间释放
调用结束,a的空间被销毁
3.2 如何避免野指针
-
指针初始化
-
小心指针越界
-
指针指向空间释放及时置NULL
-
避免返回局部变量的地址
-
指针使用之前检查有效性
4.指针运算
4.1 指针+-整数
将arr所有元素赋值为1的三种做法
4.2 指针-指针
- 指针-指针的绝对值,为指针和指针之间元素的个数。
- 不是所有的指针都能相减,指向同一块空间的2个指针才能相减!
4.3 指针关系运算
- 允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较
5.指针和数组
- 在 C语言中,虽然平时访问数组的时候是用 arr[ i ] 进行表示,但在底层解析的时候,其实是通过 *(arr + i) 这样的指针配合解引用的方式来做到的。这是指针与数组之间所能联系的核心所在。
6. 二级指针
二级指针变量是用来存放级指针变量的地址的
7.指针数组
存放指针的数组就是指针数组