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

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

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

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

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

#include
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
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));
	
}


结果是: 

 

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

你可能感兴趣的:(C语言学习记)