所以我目前正在学习 C++ 并试图掌握数组和指针之间的关系。下面的代码显示了我所做的分配。
int A[4] = {20, 30, 40, 50};
int p = A[0];
int* q = &p;
现在,如果我打印出指针值,我会得到:
A == 0x7ffda1cb1ea0
&A == 0x7ffda1cb1ea0
&A[0] == 0x7ffda1cb1ea0
&p == 0x7ffda1cb1e94
q == 0x7ffda1cb1e94
&q == 0x7ffda1cb1e98
我真的不明白为什么 &A[0] 和 &p 的值不同,即使赋值是 p = A[0]。我也不明白为什么 q 和 &q 之间只有 4 个字节,即使 q 的大小显示为 8。任何帮助将不胜感激。
最佳答案
I don't really understand why the values for &A[0] and &p are different
它们在内存中是不同的对象,所以有不同的地址。 A[4]
是一个对象,p
是另一个对象,q
是另一个对象。赋值使它们具有相同的值,但它们仍然是两个不同的对象。您可以删除分配,结果将相同。
I also don't understand how there are only 4 bytes between q and &q, even though the size of q is shown as 8
q
设置为p
的地址,&p
为您提供q
的地址。 4
的结果是有道理的,因为这就是 p
的大小。这就是为什么 q
在 p
之后出现 4
的原因,因为 p
占用 4
字节。
如果你用引用尝试同样的事情,也许会更清楚:
int A[4] = { 20, 30, 40, 50 };
int &p = A[0]; // note the "&", this makes p a reference
std::cout << "&A[0]: " << &A[0] << std::endl << "&p: " << &p << std::endl;
对我来说,这会导致:
&A[0]: 008FFD90
&p: 008FFD90
现在 p
不是可以保存数据拷贝的单独对象,而是对同一位置的实际引用。
关于c++ - 为什么我在赋值后得到不同的指针值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55358215/