int _tmain(int argc, _TCHAR* argv[])
{
 const int e = 3;
 int *w = (int *)&e;
 *w = 6; // 不会报错,但是e的值不会改变。
 e = 6; // 报错
 int a = e;
 printf("%d,%d", e, a);
 return 0;
}

分析:编译器对const的检查是对常量名进行的,因此可以通过 int *w = (int *)&e;*w=6;改变e的值。但是为什么 int a =  e;printf("%d,%d", e, a);e和a的值都是3呢?这是因为由于在编译时e的值已知,并且是const常量,所以生成的代码并不是引用e,而且直接引用了立即数3。通过printf("%d-%d,%d-%d", &e, e, w, *w);会发现&e和w(即地址值)是一样的,但是e和*w(即值)是不一样的。

参考资料:CONST

修改const值