我只是在玩指针,发现这个奇怪的东西。我创建了指针p
并显示了它的地址,就像我在下面的程序中所做的那样,p
和的地址&p
不同,为什么它们不同?
int main()
{
int *p, s[5];
cout << p <<endl;
cout << &p <<endl;
p = s;
cout << p <<endl;
cout << &p <<endl;
}
我只是在玩指针,发现这个奇怪的东西。我创建了指针p
并显示了它的地址,就像我在下面的程序中所做的那样,p
和的地址&p
不同,为什么它们不同?
int main()
{
int *p, s[5];
cout << p <<endl;
cout << &p <<endl;
p = s;
cout << p <<endl;
cout << &p <<endl;
}
P
是一个指针,表示它保存一个整数的地址。因此,当您打印 p 时,它会显示它指向的整数的地址。而当您打印时,&p
您实际上是在打印 p 本身的地址,而不是它指向的地址。
正如 Jeeva 所说,指针 p 也占用了一部分内存(图中黄色部分,它的地址是 0x300),在这个区域中,它保存的值是数组 s 的地址。所以 p == 0x100 和 &p == 0x300
如果等于,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
为什么?因为一个对象通常在内存中与其第一个数据成员相同的地址开始。