返回信息流rt,贴一下代码和运行结果
#include<iostream>
using std::cout;
using std::endl;
int main()
{
const int x1 = 10;
int *p1 = (int *)&x1;
*p1 = 20;
cout << "x1 = " << x1 << "\t x1_address: \t" << &x1 << endl
<< "p1 = " << *p1 << "\t p1_pointer:\t" << p1 << endl << endl;
const int x2 = 10;
int *p2 = const_cast<int*>(&x2);
*p2 = 20;
cout << "x2 = " << x2 << "\t x2_address: \t" << &x2 << endl
<< "p2 = " << *p2 << "\t p2_pointer:\t" << p2 << endl << endl;
return 0;
}
------------------------------------------------------------------------------------
x1 = 10 x1_address: 003CF978
p1 = 20 p1_pointer: 003CF978
x2 = 10 x2_address: 003CF960
p2 = 20 p2_pointer: 003CF960
请按任意键继续. . .
------------------------------------------------------------------------------------
两个例子,其实强制转换的效果都是相同的,不论是用(int*),还是用const_cast<int*>,都是把常量转换为非常量,问题就在于,同一地址,存储的值怎么会不一样?
这是一条镜像帖。来源:北邮人论坛 / cpp / #83944同步于 2014/11/6
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
【求助】const_cast强制类型转换,相同地址,不同值?
superbupt
2014/11/6镜像同步13 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
问这个的还真多,我在这个版就看到过三次
不要直接看结果,手动一步步看看代码直到运行前的变化
【 在 superbupt (superbupt) 的大作中提到: 】
: rt,贴一下代码和运行结果
: #include<iostream>
: using std::cout;
: ...................
最近在看C++ Primer,然后不知道怎么百度,就看到博客里面的这个问题。
目前查到的解释是“常量折叠”、和编译器优化相关,现在试着看反汇编的代码。
猜猜下面代码的输出,嘿嘿,班门弄斧一下,还望指点
const int x1 = 10;
const int *cp1 = &x1;
int *p1 = (int *)&x1;
*p1 = 20;
const int *cp2 = &x1;
cout << "x1 = " << x1 << "\t\tx1_address: \t" << &x1 << endl;
cout << "*(&x1) = " << *(&x1) << endl;
cout << "*cp1 = " << *cp1 << "\tcp1_point:\t" << cp1 << endl;
cout << "p1 = " << *p1 << "\t\tp1_pointer:\t" << p1 << endl;
cout << "*cp2 = " << *cp2 << "\tcp2_point:\t" << cp2 << endl << endl;
【 在 wangxiaobupt 的大作中提到: 】
: 问这个的还真多,我在这个版就看到过三次
: 不要直接看结果,手动一步步看看代码直到运行前的变化
:
: ...................
嗯,谢谢!希望能够再详细一点。。。
您的解释,类似于“把x1,x2存放在符号表,而不是放在内存里之类的说法”,那地址从何而来?
【 在 xiaoranMU 的大作中提到: 】
: 因为在编译的时候const int变量x1和x2已经直接替换成立即数10了
【 在 superbupt 的大作中提到: 】
: 嗯,谢谢!希望能够再详细一点。。。
: 您的解释,类似于“把x1,x2存放在符号表,而不是放在内存里之类的说法”,那地址从何而来?
编译器把用到x1,x2的值的地方,直接替换成10了。但是你去取x1,x2的地址的时候还是和普通代码一样啊,这个编译器优化不了的。