const 修饰的变量真的不能改吗?

来源:互联网 发布:安卓版windows模拟器 编辑:程序博客网 时间:2024/05/17 23:19

 我们在学校学习C的时候,我们的老师经常都会跟我们说:如果一个变量用了const来修饰的话,我们就不能改变这个变量的值。

但是事实是这样吗??当然不是。。。。。在C专家编程里面有提到,用const来修饰的变量如果已经初始话了,就不能再给这个

变量直接赋值,但是我们可以用到其他的方法来改变它的值。只要不用这个变量来赋值就可以啦,那么我们就会想到,我直接利

用它的地址来修改。下面就是我的代码:

#include<stdio.h>void test(const char *p){    char **point; char b[]="world"; printf("%s\n",p); point=(char **)&p; *point=b; printf("%s\n",p);}void main(int argc,char **argv){  const int i=6;  int *pointer;  pointer=(int *)&i;  *pointer=5;  printf("%d\n",*pointer);  printf("%d\n",i); char a[]="hello"; test(a); }


输出的结果是

这个到底是为什么第一个输出结果是5,但是第二个输出结果就是6呢??难道是内存里面的数值又变回去啦??其实里面的内存没有变回去,

只是用数值输出的时候,const修饰的变量I已经跟初始话的数值挂钩了,输出的时候不用访问内存,直接替换。但是字符窜输出的时候因为要

从变量中寻找数组地址,所以后面2次用P输出,但是会不同的原因啦!

为了证明这个我写了一个代码:

#include<stdio.h>void test(const long p){   long *point;char b[]="world";printf("%ld\n",p);point=(long *)&p;*point=(long)b;printf("%ld\n",p);}void main(int argc,char **argv){char a[]="hello";test((long)(&a));}


结果是: 

 

这是本人第一次发博客,水平有限,请多多指教,有错的请指教

原创粉丝点击