为什么同一指针有不同的地址

jat*_*iel 2 c++ pointers

class A{};

void Foo(A *p)
{ 
 std::cout << &p << std::endl; 
 std::cout << p << std::endl; 
}

int main()
{
 A *p = new A();
 std::cout << &p << std::endl;
 std::cout << p << std::endl;
 Foo(p);
}
Run Code Online (Sandbox Code Playgroud)

上面的程序为p不同的地址打印相同的值&p.有人可以解释一下原因吗?

eer*_*ika 6

上面的程序打印"p"的相同值

这是因为一个p是另一个的副本,所以它们都具有相同的值.指针的值是存储对象的存储器地址,因此具有相同的值意味着指向同一对象.

函数参数是传递给函数的对象的副本.

但"&p"的地址不同.有人可以解释一下原因吗?

p这里每个都是一个单独的变量和一个单独的对象††.两个对象同时存在.C++标准指定每个当前存在的对象具有唯一的地址†††,因此每个p地址必须具有唯一的地址.

一元运算符&是地址运算符,它返回存储操作数的存储器地址.


除非该函数参数是参考.在这种情况下,引用绑定到传递的对象.这个p论点不是参考.

††指针本身就是物体.存储指针的存储器地址与作为指向对象的存储器地址的值的存储器地址是分开的.

†††子对象有例外,但这些例外与此无关.