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);
}
上面的程序为 p
打印相同的值,但为 &p
打印不同的地址。有人可以解释为什么吗?
最佳答案
The above program prints the same value for "p"
这是因为一个 p
是另一个的拷贝,所以它们具有相同的值。指针的值是存储对象的内存地址,因此具有相同的值意味着指向同一个对象。
函数参数是传递给函数的对象的拷贝†。
but different addresses for "&p". Can somebody please explain why ?
这里的每个p
都是一个单独的变量和一个单独的对象††。两个对象同时存在。 C++标准规定每个当前存在的对象都有一个唯一的地址†††,因此这里的每个p
都必须有一个唯一的地址。
一元运算符&
是addressof运算符,返回操作数所在的内存地址。
† 除非该函数参数是一个引用。在那种情况下,引用绑定(bind)到传递的对象。 p
参数不是引用。
†† 指针本身就是对象。指针存储的内存地址与它的值的内存地址是分开的,它是指向对象的内存地址。
††† 在子对象的情况下有异常(exception),但这些异常(exception)与此处无关。
关于c++ - 为什么同一个指针有不同的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48055604/