所以我目前正在学习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
即使分配ist p = A [0],我也不真正理解为什么&A [0]和&p的值不同。即使q的大小显示为8,我也无法理解q和&q之间只有4个字节。
答案 0 :(得分:5)
我不太明白为什么&A [0]和&p的值不同
它们是内存中的不同对象,因此它们具有不同的地址。 A[4]
是一个对象,p
是另一个对象,q
是另一个对象。赋值使它们拥有相同的值,但它们仍然是两个不同的对象。您可以删除分配,结果将相同。
我也不明白q和&q之间只有4个字节, 即使q的大小显示为8
q
设置为p
的地址,而&p
为您提供q
的地址。 4
的结果是有道理的,因为p
的大小是多少。这就是q
在4
之后出现p
的原因,因为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
并不是可以保存数据副本的单独对象,而是对同一位置的实际引用。
答案 1 :(得分:3)
我不太明白为什么&A [0]和&p的值不同
A[0]
和p
是单独的对象。每个对象在其生存期内都有一个唯一的地址(某些情况下涉及子对象除外)。 A[0]
和p
的生存时间重叠。因此&A[0]
和&p
不可能相同。
即使赋值ist p = A [0]
分配对对象的存储位置没有影响。它只会影响存储在对象中的值。
即使q的大小显示为8,也无法理解q和&q之间只有4个字节
q
的大小无关紧要,因为它指向较低的地址。 p
的大小恰好是4:
/-offset from p
/ object in memory
00 p (first byte) \
01 p |
02 p |
03 p |
04 q (first byte) | Distance between p and q: 4
05 q
06 q
07 q
08 q
09 q
10 q
11 q
答案 2 :(得分:1)
当做int p = A [0]时,您只是将A [0]的值赋给p。它们都是不同的对象,并且存储在不同的位置。 如果更改p的值,则&p的值不会更改。
4的间隙是由于p的大小而引起的,它与q的大小无关。