指针和数组地址

时间:2012-07-12 05:53:54

标签: c++ pointers memory-address

我只是玩指针,发现这个奇怪的事情。我创建了指针p并显示了我在以下程序中所做的地址,p&p的地址不同,为什么它们不同?

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

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

正如Jeeva所说,指针p也占据了存储器的一部分(该图中的黄色部分,其地址为0x300),并且在该区域中,它保存了作为数组s的地址的值。所以p == 0x100和&amp; p == 0x300 Pointer

答案 2 :(得分: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

为什么呢?因为对象通常从内存中的第一个数据成员开始于同一地址。