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