3

我只是在玩指针,发现这个奇怪的东西。我创建了指针p并显示了它的地址,就像我在下面的程序中所做的那样,p和的地址&p不同,为什么它们不同?

int main()
{
    int *p, s[5];
    cout << p <<endl;
    cout << &p <<endl;
    p = s;
    cout << p <<endl;
    cout << &p <<endl;
}
4

3 回答 3

3

P是一个指针,表示它保存一个整数的地址。因此,当您打印 p 时,它会显示它指向的整数的地址。而当您打印时,&p您实际上是在打印 p 本身的地址,而不是它指向的地址。

于 2012-07-12T05:56:26.327 回答
1

正如 Jeeva 所说,指针 p 也占用了一部分内存(图中黄色部分,它的地址是 0x300),在这个区域中,它保存的值是数组 s 的地址。所以 p == 0x100 和 &p == 0x300指针

于 2012-07-12T06:17:34.703 回答
1

如果等于,p &p指针将指向自身,这仅适用于 void 指针:

void* p = &p;
assert(p == &p);

不过,我还没有看到它的实际用途:)


哦等等,它也发生在自引用递归数据结构中,这可能非常有用:

struct X
{
    X* p;

    void print()
    {
        std::cout << " p = " <<  p << '\n';
        std::cout << "&p = " << &p << '\n';
    }
};

X x;
x.p = &x;
x.print();

想想链接容器,其中最后一个节点将自己作为其后继节点。我的系统上的输出:

 p = 0x7fffb4455d40
&p = 0x7fffb4455d40

为什么?因为一个对象通常在内存中与其第一个数据成员相同的地址开始。

于 2012-07-12T06:31:27.283 回答