[英]What does the c operator *y=&x[] actually mean?
uint16_t x[] = {1,2,4,8};
uint16_t *y = &x[1];
y+=2;
所以输出是8,我想知道为什么? 我认为这应该等于4,因为&x [1]应该为2,加2应该等于4。我缺少什么?
这是您的数组:
[0] [1] [2] [3]
+---+---+---+---+
x= | 1 | 2 | 4 | 8 |
+---+---+---+---+
y = &x[1]
是指向x[1]
第二元件:
[0] [1] [2] [3]
+---+---+---+---+
x= | 1 | 2 | 4 | 8 |
+---+---+---+---+
^
|
y
y += 2
将y
向右移动两步:
[0] [1] [2] [3]
+---+---+---+---+
x= | 1 | 2 | 4 | 8 |
+---+---+---+---+
^
|
y
现在*y
是8
uint16_t *y = &x[1];
这意味着指针y
将保存“ x[1]
”数组元素的地址。
y+=2;
然后,指针在x[1]
之后移动两个位置,因此它保存了“ x[3]
”数组元素的地址。
好,
这行说: uint16_t *y = &x[1];
y
是指向x[1]
所在存储位置的指针。 x[1]
存储位置等于address_of(x) + 1*sizeof(uint16_t)
然后y+=2
开始起作用:
y
指向当前由y
指向的两个内存位置。 编译器如何知道要做什么? 它知道y
的类型,并且可以像对[]
那样以相同的方式向前跳转两个存储位置。 y+=2 => y + 2*sizeof(uint16_t) = x + 1*sizeof(uint16_t) + 2*sizeof(uint16_t) = x + 3*sizeof(uint16_t) = x[3]
。
y
现在指向前方两个位置。 由于它指向x[1]
,因此现在指向x[3]
。
您的问题是x[1]
不是持有值1的东西, x[1]
是第二个元素,因此x[1] == 2
。 换一种说法:
&x[1] == x + 1
所以
*y = x + 1
距该位置再远的2个索引是*(x + 3)
,即x[3]
或8
。
指针y的值是x [1]的地址,在下一步中,y的值增加2。
假设y的值为1000(x [1]的地址)。 增加2后,该值为1002。
因此,当您打印输出时,输出将为8,即x [3]或x [1 + 2]处的值
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.