#include <iostream> #include <stdlib.h> using namespace std; int main() { int perv; const int a = 1; int next; int *p = (int *)&a; *p = 5; // c++编译器对一般const常量不分配存储空间,而是将他们保存在符号表中,使他们真正成为编译期间的一个常量 // 没有了存储与读内存的操作,这使其效率更高。 // 当然,我们在此基础上也可为const常量分配空间,也可以使用一些技巧修改所分配空间里的内容 // 但这并不会改变const常量在符号表内的值,因为那是编译期间就确定的。 // 对于const int a = 1; // a , *&a ,*(&a), *(const int *)&a,这样的语句经过编译器优化后都以 a 的形式出现,编译器会到符号表中 // 找到相应的常量并代换进去,为编译期间常量。 // 修改const对应的内存空间内容(这是另一个位置)。修改方法: // 【1】*(otherType *)&a , 改变指针类型信息,这样的语句编译器再无法优化只能当作表达式处理 // 【2】*(&a + num - num) , 表达式 cout << "a = " << a << endl << "*&a = " << *&a << endl << "*(&a) = " << *(&a) << endl << "*(const int *)&a = " << *(const int *)&a << endl << "*(int *)&a = " << *(int *)&a << endl << "*(int *)(const double *)&a = " << *(int *)(const double *)&a << endl << "*(const int *)(int *)&a = " << *(const int *)(int *)&a << endl << "*(&a + 1 - 1) = " << *(&a + 1 - 1) << endl << endl << "*p = " << *p << endl << "*(const int *)p = " << *(const int *)p << endl << "------------------------------------------------" << endl << "&perv = " << &perv << endl << "&a = " << &a << endl << "&next = " << &next << endl << "&p = " << &p << endl << "(int *)&a = " << (int *)&a << endl << "(const int *)&a = " << (const int *)&a << endl << "&perv - &a = " << (int)&perv - (int)&a << endl << "&a - &next = " << (int)&a - (int)&next << endl << "------------------------------------------------" << endl << "*(p + 1) = " << (int *)*(p + 1) << endl << "*(p + 2) = " << (int *)*(p + 2) << endl << endl; /* char *ch = "abcd"; // const char * 到 char *的转换。这样的转换是为了对c的向下兼容 cout << "ch = " << ch << endl; ch[0] = 'A'; cout << "ch = " << ch << endl; // 对于文字常量区的内容,我们没有权限修改 */ system("pause"); return 0; }