一、前言
这一篇是对前一篇指针的补充
二、野指针
野指针就是指针指向的位置是不可知的(包括随机的、不正确的、没有明确限制的)
几点说明:
1.局部的指针变量。换句话就是没被初始化,指针变量的随机值。例如:int* a;没有进行初始化
2.指针越界访问。例如,数组中的指针变量p访问的数据个数超过了数组数。
3.指针指向的内存空间释放。
第三点结合代码理解:
int * test()
{
int a=10;//创建局部变量a,出这个函数变量会被销毁,地址会返回操作系统
return &a;
}
int main()
{
int*p=test();
*p=20;
return 0;
}
避免野指针的方法:
1.指针一定要初始化,实在不知道赋啥值,就赋一个空指针(NULL),补充:NULL的定义是((void*)0)
2.小心指针越界
3.指针指向的空间如果释放(还给人家),那么我们需要将指针置空。
4.使用指针之前要检测有效性。
总而言之:要养成一个好习惯,使用指针的时候给它初始化,指针不用的时候给它置空。
关于第三点的举例:
代码,int a=10;int* pa=&a;*p=20;这个时候我们已经把a已经操作好了,然后pa指针我们不打算再用它了,我们可以把pa置空,此时pa不再指向任何空间,这样就很好避免了未来这个指针变成野指针。
三、指针运算
1.指针±整数
2.指针-指针
3.指针的关系运算(指针比较大小)
关于这几点的解释:
第一点:已经在上面的笔记讲过
第二点:指针减指针实际算出来的是中间元素的个数(指针-指针在同一块空间才有意义)
例如:int arr[10]={1,2,3,4,5,6,7,8,9,10};&arr[9]-&arr[0];//结果是9
特别注意:
四、指针和数组
五、二级指针
利用代码举例:
int*p=&a;//一级指针
int **pp=&p;//二级指针
int ***ppp=&pp;//三级指针
特别注意:
*pp得到的操作数是p;**pp的操作数才是a
六、几个易混淆的名称
指针数组—数组
数组指针—指针
好孩子------孩子