数组中的负索引

可能重复:
C中的负数组索引?

我可以在数组中搜索负数索引吗?

#include  int main(void) { char a[] = "pascual"; char *p = a; p += 3; printf("%c\n", p[-1]); /* -1 is valid here? */ return 0; } 

是的, -1在此上下文中有效,因为它指向分配给char a[]数组的内存中的有效位置。 p[-1]相当于*(p-1) 。 在您的示例中的分配链之后,它与a+3-1a+2 ,这是有效的。

编辑:一般规则是整数和指针的加法/减法(和扩展,指针上的等效索引操作)需要产生一个指向同一个数组的结果或一个超出数组末尾的元素为了有效。 谢谢, Eric Postpischil给了一个很好的记录。

C 2011在线选秀

6.5.6加法运算符

8 …如果表达式P指向数组对象的第i个元素,则表达式(P)+N (等效地, N+(P) )和(P)-N (其中N具有值n )点分别为数组对象的第i + n和第i-n个元素, 只要它们存在 ….

强调我的。 因此,在您的具体示例中, p[-1]有效,因为它指向a的现有元素; 但是, a[-1]无效,因为a[-1]指向a的不存在元素。 类似地, p[-4]无效, a[10]无效,等等。

当然这是有效的。

(C99,6.5.2p1)“其中一个表达式应具有类型”指向对象类型的指针”,另一个表达式应具有整数类型,结果具有类型”type”。

通常使用这样的负指数是Bad Idea(TM)。 但是,我找到了一个有用的地方:trig查找表。 对于这样的查找表,我们需要使用一些角度度量作为索引。 例如,我可以使用度数作为索引来索引-180度和+180之间的角度的sin值。 或者,如果我想使用辐射,我可以使用PI的一部分,即PI/3 ,作为索引。 然后我可以通过PI/3倍数获得-PIPI之间的cos值。

是的,这是合法的,因为C允许你整天做不安全的指针算术。 但是,这很令人困惑,所以不要这样做。 另见同一问题的答案 。