c++ - 为什么我在赋值后得到不同的指针值?

标签 c++ arrays pointers

所以我目前正在学习 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 的大小。这就是为什么 qp 之后出现 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/

相关文章:

C 结构实例覆盖先前的实例

c++ - const_cast 的奇怪行为

c - 为什么函数指针有用?

c++ - 用opengl绘制子像素

c++ - 为什么我不能重载 operator=?

java - 将列表均匀分布到 Java 中的子列表中

arrays - 两个重复的和

java - 将文本文件行中的字符串标记输入数组,然后作为数组集合输出

c++ - 删除指向派生对象的基指针

c++ - libev,为什么在 evloop 中 recv 事件的编号是 3?