int main(){
const int i =0;
int *j = (int *)&i;
*j = 2;
printf("&i =%ld j =%ld \n", (long)&i,(long)j);
printf("i =%d *j=%d\n", i,*j);
return 0;
}
输出:
&i =-1081755992 j =-1081755992
i =0 *j=2
指针的地址就是变量i地址,为何*j的值改变了,const的变量i又没变,指针j改变的到底是什么?
用到了C++的常量折叠(常量替换)特性
C++对于基本类型的常量,编译器并不为其分配存储空间;在编译的时候,将它放到符号表中;
在当取符号常量的地址等操作时,才为这些常量分配存储空间,在内存中创建一个它的拷贝,通过取地址访问到的就是这个拷贝而非原始的符号常量;
与#define宏比
define宏在预编译的展开为具体值,程序运行时不再有define的这个宏;
对内存的占用:每处使用宏的地方都会分配到内存;
const常量在编译时处理,程序运行时仍然可见;
对内存的占用:在只读段中分配一块地址存放常量数据,如果常量只是在多处只读使用,将不占用额外的空间;
如果有对常量取地址的操作,将额外分配一块内存拷贝;
与C语言中的const常量比
c语言中没有常量折叠这个特性,使用c编译器编译后执行上述代码,得到的结果都是2;
示例
为了更好理解,在你的例子中再加上一个变量,指向原有的地址,可以确定地址的内容是修改了的;
更多示例参考:http://www.360doc.com/content/12/0824/20/8093902_232153101.shtml