uint16_t x[] = {1,2,4,8};
uint16_t *y = &x[1];
y+=2;
所以输出是8,我想知道为什么?在我看来,这应该等于4,因为& x [1]应该是2并且加2应该等于4.我错过了什么?
答案 0 :(得分:10)
这是你的阵列:
[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
答案 1 :(得分:3)
uint16_t *y = &x[1];
这意味着指针y
将保存" x[1]
"的地址。数组元素。
y+=2;
然后,指针在x[1]
之后移动两个位置,因此它保存" x[3]
"的地址。数组元素。
答案 2 :(得分:1)
那么,
这一行说:
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]
。
答案 3 :(得分:-1)
您的问题是x[1]
不是值1,x[1]
是第二个元素,所以x[1] == 2
。换句话说:
&x[1] == x + 1
等等
*y = x + 1
其中2个指数*(x + 3)
,即x[3]
或8
。
答案 4 :(得分:-1)
指针y值是x [1]的地址,在下一步中,y的值增加2。
说,y的值是1000(x [1]的地址)。增加2后,该值将为1002。
所以当你打印输出时会是8,这是x [3]或x [1 + 2]
的值