在c ++中为整数指针赋予常量整数引用时的行为是什么?

时间:2015-03-07 14:43:06

标签: c++

请查看以下代码。我将一个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

2 个答案:

答案 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的内存,这将导致未定义的行为。

总之,这段代码没有多大意义。