c++中const变量真的不可以修改吗?

原文链接:http://www.cppblog.com/aa19870406/archive/2012/04/10/170836.html?opt=admin

这个问题是在一次笔试题上遇到的,当时说的是c语言的环境下,我记得我用C++输出的时候确实值没变,但是后来用C发现变了,我知道确实是改变了,但是一直不明白为什么C++里输出的是没变,有人说是C++后来显示是从符号表里读出来的,不知道是不是这样~~如果有大神看见,求解答

在学c++的时候,看到的大部分的书籍对const关键字的介绍都是:const关键字修饰的变量的值是不可被修改的。但是事实真是如此吗?今天做了一个小的实验,发现const变量是可以被修改的。c++代码如下:           

 1  #include  < iostream >
 2  using  namespace  std;
 3 
 4  int  main()
 5  {
 6       const  int  a  =  3 ;
 7       int *  p  =  const_cast < int *> ( & a);
 8       * =  4 ;
 9      cout  <<  " value of p:  "  <<  * <<  endl;
10      cout  <<  " value of a:  "  <<  a  <<  endl;
11      cout  <<  " address of p:  "  <<  p  <<  endl;
12      cout  <<  " address of a:  "  <<  & <<  endl;
13 
14       return  0 ;
15  }             
上面代码第7行将a的地址赋值给指针p,然后第8行修改p所指向的地址中的值,运行结果如下:
运行结果
value of p: 4
value of a: 3
address of p: 0x7fbffff7fc
address of a: 0x7fbffff7fc
如上所示结果,指针p所指向的地址和变量a的地址相同,但是p所指地址中的值已经发生改变。但是为何变量a对应的地址中的值已经由3变为4,但是a的值确实3呢?
暂时把这个问题搁浅。再来看一下如下的c++代码:
 1  #include  < iostream >
 2  using   namespace  std;
 3  const   int  a  =   3 ;
 4  int  main()
 5  {
 6       // const int a = 3;
 7       int *  p  =  const_cast < int *> ( & a);
 8       * =   4 ;
 9      cout  <<   " value of p:  "   <<   * <<  endl;
10      cout  <<   " value of a:  "   <<  a  <<  endl;
11      cout  <<   " address of p:  "   <<  p  <<  endl;
12      cout  <<   " address of a:  "   <<   & <<  endl;
13 
14       return   0 ;
15  }
如上代码g++编译通过,在运行时报错如下:
输出结果
Segmentation fault (core dumped)
由此可见,在c++中全局const变量和局部const变量的编译器处理的方法是不一样的。查阅资料得知,全局const变量是不分配内存地址的,它编译器放置在符号表中作为编译期常量,全局const变量放在只读数据段中,受到只读数据段的权限保护,当你修改一个只读数据段中的内容时,会得到一个运行时错误。而局部const变量是放在堆栈之中,因为在内存中有地址,通过修改地址中的值可以达到修改const所指内存中值的目的。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值