C中是否允许负数组索引?

C中是否允许负数组索引?

我只是在读一些代码,发现那个人正在使用arr[-2]对象之前的第二个元素。arr,就像这样:

|a|b|c|d|e|f|g|
       ^------------ arr[0]
         ^---------- arr[1]
   ^---------------- arr[-2]

这是允许的吗?

我知道arr[x]是相同的*(arr + x)..所以arr[-2]*(arr - 2),这似乎没问题。你认为如何?



12345678_0001
浏览 407回答 3
3回答

HUX布斯

这是正确的。摘自C99第6.5.2.1/2号编:下标算子[]的definition是E1[E2]与(*(E1)+(E2)完全相同。没有魔法。这是1-1等价物。与往常一样,当取消引用指针(*)时,您需要确保指针指向的是有效地址。

收到一只叮咚

只有在下列情况下才有效arr指向数组中的第二个元素或后一个元素的指针。否则,它将无效,因为您将访问数组边界之外的内存。因此,例如,这是错误的:int arr[10];int x = arr[-2]; // invalid; out of range但这没什么大不了的:int arr[10];int* p = &arr[2];int x = p[-2]; // valid:  accesses arr[0]然而,使用负值下标是不寻常的。
打开App,查看更多内容
随时随地看视频慕课网APP