5

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

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

#include <stdio.h>

int main(void)
{
    char a[] = "pascual";
    char *p = a;

    p += 3;
    printf("%c\n", p[-1]); /* -1 is valid here? */
    return 0;
}
4

5 回答 5

8

是的,-1在这种情况下有效,因为它指向分配给char a[]数组的内存中的有效位置。p[-1]相当于*(p-1)。按照您示例中的分配链,它与有效的a+3-1, 或相同a+2

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

于 2012-10-05T18:22:18.990 回答
3

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]无效等。

于 2012-10-05T18:39:03.920 回答
2

当然是有效的。

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

于 2012-10-05T18:21:39.667 回答
1

通常使用这种负面索引是一个坏主意(TM)。但是,我发现了一个有用的地方:三角查找表。对于这样的查找表,我们需要使用一些角度度量作为索引。例如,我可以sin使用度数作为索引来索引 -180 度和 +180 度之间的角度值。或者,如果我想使用 radions,我可以使用 PI 的某个分数的倍数,例如PI/3,作为索引。然后我可以得到.的倍数cos之间-PI的值。PIPI/3

于 2012-10-05T18:32:57.630 回答
-2

是的,这是合法的,因为 C 允许您整天进行不安全的指针运算。但是,这很令人困惑,所以不要这样做。另请参阅同一问题的答案

于 2012-10-05T18:22:12.733 回答