野指针
概念:野指针就是指指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
野指针成因
1.指针未初始化
2.越界访问
3.指针指向的空间释放
如何规避野指针
1.指针初始化
2.小心指针越界
3.指针指向空间释放及时置NULL
4.指针使用之前检查有效性
指针运算
指针±整数
指针+整数
int prices[8] = { 100, 200, 500, 800, 1000, 2000, 5000, 10000 };
int* p = &prices[0]; //prices;
printf("%d\n", *p); //100
p = p + 1; // p++;
printf("%d\n", *p); // 200
p = p + 2;
printf("%d\n", *p); // 800
int prices[8] = { 100, 200, 500, 800, 1000, 2000, 5000, 10000 };
char* p2 = &prices[0]; //prices;
printf("%d\n", *p2); // 100
p2 = p2 + 1; // p++;
printf("%d\n", *p2); // 0
原因分析:
结论:指针+1, 指向该指针的下一个“数据”。如果是char指针,那么就前进一个字节,指针的值只加了1。如果是int指针,那么就指向下一个整数,而一个整数是占4个字节的,所以指针的值,实际上被加了4.
p = p + n; // 指针p的值,增加了 n*sizeof(p指向的数据的数据类型)
指针-整数
int prices[8] = { 100, 200, 500, 800, 1000, 2000, 5000, 10000 };
int* p1 = &prices[1]; //prices;
printf("%d\n", *p1); //200
p1 = p1 - 1;
printf("%d\n", *p1); //100
int prices[8] = { 100, 200, 500, 800, 1000, 2000, 5000, 10000 };
char* p2 = &prices[1]; //prices;
p2 = p2 - 1;
printf("%d\n", *p2); // 0
原因分析:
p = p - n; // 指针p的值,减少了 n*sizeof(p指向的数据的数据类型)
指针-指针
指针-指针得到的是两个指针之间的元素个数
只有当两个指针都指向同一个数组中的元素时,才允许从一个指针减去另一个指针
int prices[8] = { 100, 200, 500, 800, 1000, 2000, 5000, 10000 };
int* p1 = &prices[0];
int* p2 = &prices[5];
printf("%d\n", p2 - p1); // 5
char* p3 = &prices[0];
char* p4 = &prices[5];
printf("%d\n", p4 - p3); // 20
指针减指针,结果为这两个指针之间间隔了多少个“对应类型”的数据。
指针的关系运算
跟上面一样,values数组中有五个元素