我们平时写一些代码时,const是一个被频繁用到的关键字,所以会恰当的使用const关键字是非常重要的,在这里我们学习一下const修饰指针变量时的用法。
目录
1.const的定义
1.const:const关键字修改类型声明的类型或函数参数的类型,防止值发生变化。
2.通俗来说,const放在谁前面,它的值是不可以被修改的,是被锁定的(对整型类来说确实是这样),但对于指针类型来说,const的位置要分两种情况来讨论。
2.const修饰指针变量时的作用
上面也曾提到,讨论它修饰指针变量时,我们要分俩种情况讨论,就是:
1.const放在*的左边;
2.const放在*的右边;
下面我们通过代码来学习它的用法。
2.1const在指针变量中的应用
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
const int num = 10;
int* p = #
*p = 20;
printf("%d\n", num);
return 0;
}
我们来分析一下这段代码,我们在num前使用了const,想要锁定num的值等于10,然后我们把num的地址放入指针中,通过指针改变了num的值,指针抓住了程序的漏洞,改变了num的值,变为20。
所以,想要解决这个问题,我们必须根据实际情况在指针变量前再加一个const来锁定它。
2.2const放在*的左边
int main()
{
const int num = 10;
const int* p = #
*p = 20;
printf("%d\n", num);
return 0;
}
1.我们在*左边再加一个const后,*p就不可被修改,我们运行代码时,*p=20就会报错:
2.const int* p = #等价于int const * p=&num,因为const都在*的左边;
3.但此时,p的值是可被修改的,const锁定的是*p的而不是p,例如:
int main() { const int num = 10; const int* p = # //*p = 20; int n = 1000; p = &n; printf("p=%d\n", *p); printf("%d\n", num); return 0; }
我们能清楚的看到,num的值没有被修改,但p的值让修改了,n存入了p中。
2.3const放在*的右边
int main()
{
const int num = 10;
int* const p = #
*p = 20;
int n = 1000;
p = &n;
printf("p=%d\n", *p);
printf("%d\n", num);
return 0;
}
1.当我们把const放在*右边时,p的值就被锁定,当我们运行这段代码时,p=&n这句代码就会报错:
2.但此时,*p的值是可被修改的,const锁定的值是p的而不是*p:
int main() { const int num = 10; int* const p = # *p = 20; int n = 1000; //p = &n; //printf("p=%d\n", *p); printf("%d\n", num); return 0; }
我们看到,num=20;这说明,*p确实修改了num的值,因为p=&n这条代码报错会影响结果的输出,所以这里把它注释掉了,大家可以再自己的机子上尝试。
3.总结
说了这么多,其实是比较乱的,这里给大家系统的总结一下const修饰指针变量:
我们就用这三条代码来说明:int num=10;
int * p=#
int n=1000;
1.const放在*左边,const修饰的是指针指向的内容,不能通过指针来改变了,但是指针变量本身可以修改,即:
const int * p=&num;
*p=20;//error
p=&n;//ok
2.const放在*右边,const修饰的是指针变量本身,表示指针变量本身的内容不可被修改,但是指针指向的内容,可以通过指针来改变,即:
int * const p=#
*p=20;//ok
p=&n;//error
好了,有关const修饰指针变量的用法我们已经说完了,大家平时多看多记,很快就学会了!!!