加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

const修饰的变量能否被修改?

(2012-10-24 21:40:03)
标签:

const

可以被修改

修饰

杂谈

分类: C/CPP
我们在学习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);  

}

 输出结果是http://hi.csdn.net/attachment/201110/20/0_1319095991U535.gif

 

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

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

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

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

  1. 
    
  2. #include<stdio.h>   
  3. void test(const long p)  
  4.     
  5.     long *point;  
  6.     char b[]="world" 
  7.     printf("%ld\n",p);  
  8.     point=(long *)&p;  
  9.     *point=(long)b;  
  10.     printf("%ld\n",p);  
  11.  
  12. void main(int argc,char **argv)  
  13.  
  14.     char a[]="hello" 
  15.       
  16.     test((long)(&a));  
  17.       
结果是:http://hi.csdn.net/attachment/201110/20/0_1319096269GUH9.gif 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有