可能重复:
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;
}
可能重复:
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;
}
是的,-1
在这种情况下有效,因为它指向分配给char a[]
数组的内存中的有效位置。p[-1]
相当于*(p-1)
。按照您示例中的分配链,它与有效的a+3-1
, 或相同a+2
。
编辑:一般规则是整数和指针的加法/减法(以及扩展,指针上的等效索引操作)需要产生指向同一数组或数组末尾之外的一个元素的结果为了有效。谢谢,Eric Postpischil的精彩笔记。
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) “其中一个表达式的类型应为“指向对象类型的指针”,另一个表达式应为整数类型,结果的类型为“类型”。
通常使用这种负面索引是一个坏主意(TM)。但是,我发现了一个有用的地方:三角查找表。对于这样的查找表,我们需要使用一些角度度量作为索引。例如,我可以sin
使用度数作为索引来索引 -180 度和 +180 度之间的角度值。或者,如果我想使用 radions,我可以使用 PI 的某个分数的倍数,例如PI/3
,作为索引。然后我可以得到.的倍数cos
之间-PI
的值。PI
PI/3
是的,这是合法的,因为 C 允许您整天进行不安全的指针运算。但是,这很令人困惑,所以不要这样做。另请参阅同一问题的答案。