c运算符* y =& x []实际上是什么意思?

时间:2017-08-03 13:24:24

标签: c operators

uint16_t x[] = {1,2,4,8};
uint16_t *y = &x[1];
y+=2;

所以输出是8,我想知道为什么?在我看来,这应该等于4,因为& x [1]应该是2并且加2应该等于4.我错过了什么?

5 个答案:

答案 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]

的值