c 运算符 *y=&x[] 实际上是什么意思?
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。我错过了什么?
uint16_t *y = &x[1];
表示指针y
将保存“x[1]
”数组元素的地址。
y+=2;
然后,指针在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
。
这是你的数组:
[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
指针y的值是x[1]的地址,下一步y的值加2。
比如说,y 的值为 1000(x[1] 的地址)。增加 2 后,该值为 1002。
因此,当您打印时,输出将是 8,这是 x[3] 或 x[1+2]
处的值
嗯,
这一行说:
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]
。
uint16_t x[] = {1,2,4,8};
uint16_t *y = &x[1];
y+=2;
所以输出是 8,我想知道为什么?在我看来,这应该等于 4,因为 &x[1] 应该是 2,加上 2 应该等于 4。我错过了什么?
uint16_t *y = &x[1];
表示指针y
将保存“x[1]
”数组元素的地址。
y+=2;
然后,指针在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
。
这是你的数组:
[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
指针y的值是x[1]的地址,下一步y的值加2。
比如说,y 的值为 1000(x[1] 的地址)。增加 2 后,该值为 1002。
因此,当您打印时,输出将是 8,这是 x[3] 或 x[1+2]
处的值嗯,
这一行说:
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]
。