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