以下是阿里的一道笔试题:
应该选什么?
考试结束后,和朋友讨论以及晚上查证,答案应该不确定。
在Dev c++里跑了以下程序:
#include <iostream>
using namespace std;
int main(void)
{
const int a = 10;
// int a = 10;
int *p = (int *)&a;
// const int *p = &a;
// int *p;
// p = &a;
*p = 20;
cout << a << endl << *p << endl;
cout << (&a == p) << endl;
return 0;
}
运行结果如下:
调试结果如图:
分析:
*p 和 a 实际指向了同一个地址,所以他们的值应该是一致的,都被改变了。为什么?
int *p = (int *)&a;
在于上面这一句,强制类型转换,所以把const复制给非const,不会导致编译出错。
后面也就可以正大光明的对该地址的值进行修改。
为什么结果a的值与*p的值不等呢?
原因是编译器再编译的时候,就把a替换为10了,导致输出的值没变。
所以最终结果与编译器是相关的。