【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 1846|回复: 3

关于const的奇怪现象

[复制链接]
发表于 2012-8-16 21:33:46 | 显示全部楼层 |阅读模式
//请大家看下代码
  1.     const int a = 10;
  2.         int *p = (int*)&a;
  3.         *p = a+10;
  4.         cout<<"a的值:"<<a<<endl;
  5.         cout<<"*p的值:"<<*p<<endl;
  6.         cout<<"a的地址"<<&a<<endl;
  7.         cout<<"p的地址"<<p<<endl;
复制代码
以上代码定义的a是一个const常量,我把指针指向了a,修改指针内存地址里的值时,修改成功了,并且出现了个奇怪现象,指针p的地址居然和a是同一个地址。并且a的值还是= 10. 如果指针指向的地址有改变,第一个问题,怎么2个地址是一样的?如果指针指向的地址没有改变,还是const a ,那么,为什么常量可以改变值呢?如果是a的地址变了,为什么输出a的值的时候还是10呢?而不是20
请大家指教。

点评

这绝对是个好东西啊!!  发表于 2012-8-25 00:48
发表于 2012-8-19 11:15:31 | 显示全部楼层
估计这是Vc编辑器对const 常变量在编译的时候优化的结果。

微软提倡使用const 替换掉曾经占统治地位的#define 方式定义常量
现在定义const int  a =10,等同于#define a 10
这样做的好处是可以对const 变量进行语法检查。
但是估计微软为了提高效率,对const int a的变量a在编译的时候操作和#define a 的操作是一样的,凡是遇到a的地方直接替换成10,这样输出的a就永远是10,其实此时*p指向的空间a里的值已经是20了

朋友通过别的编辑器编译完输出的 a和*p的结果就都是20
以上仅为参考,希望有朋友能提出更准确的答案。
 楼主| 发表于 2012-8-25 18:02:32 | 显示全部楼层
恩。现在我也弄明白了。归根结底就是const和define的关系。哈哈。好玩吧。
发表于 2012-8-26 15:54:38 | 显示全部楼层
第一个问题,怎么2个地址是一样的?
你自己初始化的p=&a,当然地址一样

如果指针指向的地址没有改变,还是const a ,那么,为什么常量可以改变值呢?
你把const int*强制类型转换成了int*,当然就可以改变了

如果是a的地址变了,为什么输出a的值的时候还是10呢?而不是20
编译器优化了!

不信就去看汇编结果~~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2025-6-24 11:24

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表