一、const对指针变量的修饰
用const修饰指针,放在*左边和*右边是不一样的。
1、左边
请看以下代码:
我们可以看到,在这段代码中,编译器给出了报错:
显然编译器认为p所指向的内容并不能通过*p来修改,那既然不能用*p来修改m的值,我们能不能干脆让p换一个指向变量呢?
#include<stdio.h>
int main() {
int m = 10;
int n = 20;
const int* p = &m;
p = &n;
printf("%d", *p);
return 0;
}
可以看到,指针变量p成功从指向m变为指向n。
因此,当const修饰在*左边时,表示不能通过指针来修改它所指向的变量的值,但是指针本身的内容可以被修改。
2、右边
请看以下代码:
与上次不同,编译器认为不能将已经指向m的指针变量p重新指向n,但是通过指针变量p修改m的值是编译器所允许的。
m的值被成功修改了。
因此,当const位于*右面时,保证了指针变量本身的内容不能被修改,但是指针所指向的变量的内容可以被修改。
二、野指针成因
野指针成因有以下几点:
1、未对指针变量进行初始化,为随机值。
#include<stdio.h>
int main() {
int* p;
*p = 20;
return 0;
}
2、越界访问
#include<stdio.h>
int main() {
int arr[10] = { 0 };
int* p = &arr[0];
int i = 0;
for (i = 0; i <= 11; i++)
{
//当指针指向的范围超出数组arr的范围时,p就是野指针
*(p++) = i;
}
return 0;
}
3、指针所指向的空间已被释放
int* test()
{
int n = 100;
return &n;
}
int main()
{
int* p = test();
printf("%d\n", *p);
return 0;
}
当函数被调用完成后,函数中的变量所占用的内存已被回收,此时p指向的内容是未知的。
三、如何规避野指针
1、及时对指针变量进行初始化。如果不知道指针该指向哪里,那就用NULL(空指针)进行初始化。如:
#include <stdio.h>
int main()
{
int num = 10;
int*p1 = #
int*p2 = NULL;
return 0;}
2、小心指针越界,不要超出访问范围。当指针不再使用时,及时置为NULL。
3、在函数中,避免返回局部变量的地址。
四、本章小结
1、当const修饰在*左边时,表示不能通过指针来修改它所指向的变量的值,但是指针本身的内容可以被修改。当const位于*右面时,指针变量本身的内容不能被修改,但是指针所指向的变量的内容可以被修改。
2、野指针的成因包括:未对指针变量进行初始化,越界访问和指针所指向的空间已被释放
3、为了避免野指针:及时对指针变量进行初始化,小心指针越界,避免返回局部变量的地址。
以上就是本章全部内容,如果你喜欢这篇文章的话,不要忘记点赞,收藏,关注哦!