问题是这样的:
#include <stdio.h>
int main()
{
const int x = 1; //字面量初始化,此时x为常量,进入符号表
const int& rx = x; //rx代表只读变量
int& nrx = const_cast<int&>(rx); //去掉rx的只读属性
nrx = 5; //改变了nrx内存空间的值
printf("x = %d\n", x); // 1
printf("rx = %d\n", rx); // 5
printf("nrx = %d\n", nrx); // 5
printf("&x = %p\n", &x); // &x = 002CFD80
printf("&rx = %p\n", &rx); // &x = 002CFD80
printf("&nrx = %p\n", &nrx); // &x = 002CFD80
//输出的地址相同,说明了x、rx、nrx代表同样的内存空间
为什么明明内存地址相同,却输出的值并不相同 ?
答案:是编译器对常量的优化问题,其实已经都改为了1,只不过编译器输出x的值时并不会去内存读值,直接用值1去替换,可以在前面加上volatile修饰,从而让编译器取消优化。volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略