1.野指针
野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
野指针的形成主要有三种方式:
指针未初始化、指针越界访问及指针指向的空间释放
//野指针
//int main()
//{
// int* p;//局部变量指针未初始化,默认为随机值
// *p = 20;
// return 0;
//}
//指针越界访问
//int main()
//{
// int arr[10] = { 0 };
// int* p = arr;
// int i = 0;
// for (i = 0; i <= 11; i++)
// {
// //当指针指向的范围超出数组arr的范围时,p就是野指针
// *(p++) = i;
// }
// return 0;
//}
//指针指向的空间释放
//int test()
//{
// int x = 0;
// return &x;
//}
//
//int main()
//{
// int* p = test();
// *p = 20;
//
// printf("%d", *p);
// return 0;
//}
那么我们需要如何规避野指针呢?
一般我们初始化指针都是先让其指向NULL,让其成为空指针,确保他不会随意指向别的空间,此时指针指向NULL所在的空间;
因为这是官方定义的空间,我们不能修改,不能使用其地址,直接解引用其会报错,所以我们在解引用时可以判断其是否为空指针,确保其不会出错;
同时我们要小心指针越界,避免返回局部变量的地址,指针指向空间释放时及时置NULL;
//int main()
//{
// int* p = NULL;
// //....
// int a = 10;
// p = &a;
// if (p != NULL)
// {
// *p = 20;
// }
// return 0;
//}
二级指针及多及指针
二级指针是用来存放一级指针的地址的
*ppa 通过对ppa中的地址进行解引用,这样找到的是 pa , *ppa 其实访问的就是 pa
当然也有三级甚至多级,其怎么用就跟二级指针差不多,套娃,hhh
//#include<stdio.h>
//int main()
//{
// int a = 15;
// int* pa = &a;
// int** ppa = &pa;
//
// printf("%d", **ppa); //**ppa是二级指针用来存放一级指针,*ppa相当于pa(注意不是*pa)
//}