&(*a)在c ++中的操作,反直觉?

ele*_*ias 3 c++

在这段代码中:

  int* a;
  int* b;
  int c;
  int* d;
  a=new int(5);
  b=&(*a);
  c=*a;
  d=&c;
  cout<<"*a = "<<*a<<endl;
  cout<<"a = "<<a<<endl;
  cout<<"b ="<<b<<endl;
  cout<<"d = "<<d<<endl;
Run Code Online (Sandbox Code Playgroud)

我明白了:

*a = 5
 a = 0x83a2008
 b =0x83a2008
 d = 0xbfbfe540
Run Code Online (Sandbox Code Playgroud)

为什么d与b不同?他们俩都不是&(*a)?如何用一行得到d结果?

非常感谢.

Jer*_*fin 7

a指向一个动态分配的位置,保持值为5.当您这样做时c = *a;,您将从该动态分配的位置复制 5 c.然后,您将获取地址c并将其分配给d(并将其打印出来).

当你最终得到这样的东西:

在此输入图像描述

实线表示指向位置的指针.虚线表示数据的移动.


Jor*_*aye 6

c是它自己int而不是int*.当你说c = *a,你实际上是将指向的值赋给a一个单独的整数,并在内存中有自己的空间(即使这int不是一个int*,它仍然必须存在于内存中的某个地方).

所以,当你说d = &c,你得到的地址c,而不是价值a.