1.野指针
- 定义:访问了一个已经销毁或者受限的内存区域外的指针,这个指针也被称为野指针
- 野指针产生的场景:
- 变量未初始化,通过指针访问该变量
int a; int *p = &a; //p就是野指针 ptf(*p); //访问野指针,但是数据不安全
- 指针变量未初始化
int *p = NULL; //此时的p也是野指针 ptf(*p);
- 指针的内存空间被(free函数)回收了
- 指针函数中直接返回了局部变量的地址
- 指针指向数组以外的地址(下标越界)
- 如何避免野指针:
- 写代码要养成两个习惯(通过编码规范避免)
- 指针变量要及时初始化,如果暂时没有对应的值,建议赋值为NULL
- 数组操作(遍历,指针运算)时,注意数组的长度,避免越界
- 指针指向的内存空间被回收,建议给这个指针变量赋值为NULL
- 指针变量使用之前要检查它的有效性(以后开发中要做非空校验)
说明:NULL是空常量,它的值是0,这个NULL一般存放在内存中的0X00000000位置,这个地址只能存放NULL,不能被其他程序修改
2.空指针
空指针,又被称作悬空指针:当一个指针的值是NULL,这个指针被称为空指针;对空指针访问时出现报错(段错误)
3.二级指针
-
定义:二级指针,又被称作多重指针,引用一级指针的地址,此时这个指针变量就得定义成二级指针。
-
定义格式:
数据类型 **变量名 = 指针数组的数组名或者一级指针的地址
举例:
// 字符型指针数组
char *arr[3] = {"abc","aaa034","12a12"};// 等效于:char arr[3][6] = {"abc","aaa034","12a12"}
// 定义二级指针并赋值(指针需要跟依赖的源同类型)
char **p = arr;// 正确
int array[2][3] = {{1,2,3},{11,22,33}};
int **k = array;// 编译报错,数据类型不相符(二维数组不等于指针数组)
int a = 90;
int *p = &a;// 一级指针
int **k = &p;// 正确,二级指针
- 结论
1.
二级指针和指针数组是等效,和二维数组不等效
2.
二维数组和数组指针是等效,和二级指针不等效
- 二级指针的用法:
1.
如果是字符的二级指针,可以像遍历字符串数组一样遍历它
2.
如果是其他的二级指针,就需要解引用两次访问它所指向的数据