先看原始代码
#include<iostream>
using namespace std;
void main(void)
{
const int i = 0xffff;
int *p = const_cast<int*>(&i); //让p指向i的首地址
*p = 0x0000;
cout<<"i="<<i<<" *p="<<*p<<endl;
}
using namespace std;
void main(void)
{
const int i = 0xffff;
int *p = const_cast<int*>(&i); //让p指向i的首地址
*p = 0x0000;
cout<<"i="<<i<<" *p="<<*p<<endl;
}
结果并非如我所想
i=65535 *p=0
*p=0说明原先i所指内存确实被改变了,但是i=65535怎么解释呢?
原来编译器在编译的时候做了优化,它(编译器其实是很弱智的)认定我声明了const量后再不会改变,于是编译的时候“动了手脚”,将代码中出现该const量的地方替换成声明时候的值!给人感觉上就像一个宏替换的过程。
程序修改成这样后可以达到我原先的“企图”。
Code
i=0 *p=0