#include <iostream>
using std::cout;
using std::endl;
int main(int argc, char *argv[])
{
const int count = 10;
int *p = (int *)&count;
*p = 100;
cout << "count: /t/t/t" << count << endl;
cout << "&count: /t/t" << &count << endl;
cout << "*((int *)&count): /t" << *((int *)&count) << endl;
cout << "*(&count): /t/t" << *(&count) << endl;
cout << "*p: /t/t/t" << *p << endl;
cout << "p: /t/t/t" << p << endl;
return 0;
}
上述代码在 gcc 中的运行结果如下:
count: 10
&count: 0xbfa723cc
*((int *)&count): 100
*(&count): 10
*p: 100
p: 0xbfa723cc
解释:
常量 count 的地址和指针 p 的值是一样的;
对于程序中出现的、前面没有取地址符的 count,gcc 在编译时直接把它换成了 count 的值 10;
对于程序中的 *(&count),gcc 同样处理;
在这里,gcc 识别出它们是常量类型,认为它们的值不会被改变,也就是说,它们的值在编译期就被确定了;
对于 *((int *)&count) 和 *p,gcc 识别出它们是对 int * 类型的指针的解引用,编译期间无法确定,gcc 将它们的求值留给运行期来决定。