请查看以下代码。我将一个const整数值的地址分配给一个整数指针。我也可以打印这些地址,但我无法打印值(注释行)。请问有人可以在内部解释实际发生的事情吗?
int main()
{
int *a;
cout<<a<<"\n";
a = (int*)20;
cout<<a<<"\n";
cout<<(int*)20<<"\n";
int *b;
cout<<b<<"\n";
b = (int*)20;
cout<<b<<"\n";
//cout<<*a<<"\n";
//cout<<*b<<"\n";
return 0;
}
Output:
-------
0
0x14
0x14
0x7fff3c914690
0x14
答案 0 :(得分:4)
您没有分配const整数值的地址。相反,你所说的是“将20作为地址”,即(int*)20
。因此,当你取消引用它(即*a
)时,你说的是地址20处的内容当然是垃圾。在获取地址之前,您需要在某处存储20个。
const int value = 20;
const int * a = &value;
cout << *a << endl;
没关系......
答案 1 :(得分:1)
让我们逐行完成:
int *a;
这会初始化一个指向int的指针,其中包含当时恰好在内存中的随机数据。
cout<<a<<"\n";
打印内存地址a
保持,这是随机的,因为它未初始化。
a = (int*)20;
将20
视为包含int的内存地址,并使a
指向该内存地址(同样包含随机垃圾数据)。
cout<<a<<"\n";
输出a
持有的地址,即20
。
cout<<(int*)20<<"\n";
输出20
作为内存地址。
int *b;
cout<<b<<"\n";
b = (int*)20;
cout<<b<<"\n";
与a
相同,见上文。
cout<<*a<<"\n";
cout<<*b<<"\n";
这两个会取消引用地址20
的内存,这将导致未定义的行为。
总之,这段代码没有多大意义。