3.野指针
野指针概念:野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
野指针成因:
1.指针未初始化
、
#include<stdio.h> int main() { int a;//局部变量不初始化,默认是随机值 int* p;//局部的指针变量不初始化,默认也会给随机值 *p = 20;//这时候对指针进行解引用操作,实际上并不知道更改的内存是在哪里 return 0; }
2.指针越界访问
#include<stdio.h> int main() { int arr[10] = { 0 }; int* p = arr; int i = 0; for (i = 0; i < 12; i++) { //当指针指向的范围超出数组arr的范围时,就越界访问了,此时p就是野指针 *(p++)=1; } return 0; }
3.指针指向的空间释放
#include<stdio.h> int* test() { int a = 10; return &a; } //1.a 创建的空间在函数结束的时候返回给系统了,不属于当前程序的内容 int main() { int* p = test(); //2.这时候通过*p 去访问一个返还系统的空间,该空间有可能已经存放其它内容了 //3.所以p是一个野指针 *p = 20; return 0; }
那么我们如何能够避免野指针呢?
1.指针初始化
2.小心指针越界
3.指针指向空间释放,即置为NULL
int*pa=NULL; //空指针
4.指针使用之前检查有效性
4.指针运算
指针运算有三种,分别为:
①指针 + -整数
②指针 - 指针
③指针的关系运算
下面对这三种运算进行详细的讲解:
①指针 + - 整数
#include<stdio.h> int main() { int arr[10] = { 1,2,3,4,5,6,7,8,9,10}; int i = 0; int sz = sizeof(arr) / sizeof(arr[0]); int* p = arr; for (i = 0; i < sz; i++) { printf("%d ", *p); //p = p + 1; //指针 + 整数 p++; } return 0; }
这里我们使用的时指针 + 1,那么指针 + 2或指针 + 3是什么样子的呢?请看下面的举例;
指针除了可以 + 整数,也可以 - 整数,比如:
int*p=arr[sz-1]–>访问下标
练习:
解析:
②指针 - 指针
我们知道指针变量是用于存放地址的,那么指针 - 指针 就是 地址 - 地址,那指针 - 指针的结果又是什么呢?请看下面的例子:
打印 & arr[9] - &arr[0] 结果为9,代表从arr[0]到arr[9], 其中间有9个元素。
总结:指针 - 指针得到的结果是中间元素的个数
当然如果我们将 & arr[9] - &arr[0] 的顺序调换以下,变成 & arr[0] - &arr[9],得到的又是什么呢?