为什么分配后我得到不同的指针值?

时间:2019-03-26 13:20:31

标签: 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

即使分配ist p = A [0],我也不真正理解为什么&A [0]和&p的值不同。即使q的大小显示为8,我也无法理解q和&q之间只有4个字节。

3 个答案:

答案 0 :(得分:5)

  

我不太明白为什么&A [0]和&p的值不同

它们是内存中的不同对象,因此它们具有不同的地址。 A[4]是一个对象,p是另一个对象,q是另一个对象。赋值使它们拥有相同的值,但它们仍然是两个不同的对象。您可以删除分配,结果将相同。

  

我也不明白q和&q之间只有4个字节,   即使q的大小显示为8

q设置为p的地址,而&p为您提供q的地址。 4的结果是有道理的,因为p的大小是多少。这就是q4之后出现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的大小无关。