繁体   English   中英

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。我缺少什么?

这是您的数组:

    [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 += 2y向右移动两步:

    [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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM