c++ - 为什么同一个指针有不同的地址

标签 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);
}

上面的程序为 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/

相关文章:

C++根据 parent 的指针删除 child

c++ - 在 C++ 模板函数中,我可以返回取消引用的参数类型吗?

c - 解析数组,查找值并使用校验和

c++ - 如何正确清理 QWidget/管理一组窗口?

c++ - 为什么我不能比较自定义类类型的两个 vector ?

c++ - 使用 std::remove_reference 获取 STL 容器的元素迭代器

c - 为什么我的程序在将内存分配给双指针 C 时会产生段错误

c++ - 在允许用作模板类型的函数内使用内联类吗?

c++ - (float)(1.2345f * 6.7809) 是否比 1.2345f * 6.7809f 更准确?

c++ - 一个指向指针的指针如何对应一个二维数组?