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]