首先看下面一段代码:
#include <iostream>
using namespace std;
int
main()
{
const int i = 10;
int *pi = const_cast<int *>(&i);
++*pi;
cout << " i = " << i << ", @" << &i << endl;
cout << "*pi = " << *pi << ", @" << pi << endl;
}
运行结果是:
i = 10, @0x28ff44
*pi = 11, @0x28ff44
我想问的是,变量 i 的值到底有没有被改变?问什么同一个地址输出的值不一样?
这里是编译器决定的,你用VS2008调试就会发现,i的值在调试窗口里都是变化了的。但是const表示的是一个常量,不可变的,如果用const-cast又可将它改变,就自相矛盾了。
于是编译器采取了一种方案,在汇编里可以看出端倪:
cout << " i = " << i << ", @" << &i << endl;
004142B8 mov esi,esp
004142BA mov eax,dword ptr [__imp_std::endl (41A348h)]
004142BF push eax
004142C0 mov edi,esp
004142C2 lea ecx,[i]
004142C5 push ecx
004142C6 push offset string ", @" (417880h)
004142CB mov ebx,esp
004142CD push 0Ah
004142CF push offset string " i = " (417878h)
004142D4 mov edx,dword ptr [__imp_std::cout (41A34Ch)]
004142DA push edx
10是直接使用的(见上面的push 0Ah),并不是按我们的惯性思维从地址里去取的。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。