我可以在数组中使用负数索引吗?
#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;
}
答案 0 :(得分:8)
是的,-1
在此上下文中有效,因为它指向分配给char a[]
数组的内存中的有效位置。 p[-1]
相当于*(p-1)
。按照示例中的分配链,它与a+3-1
或a+2
相同,后者有效。
编辑:一般规则是整数和指针的加法/减法(以及扩展,指针上的等效索引操作)需要产生指向同一数组的结果或者超出数组末尾的一个元素才能生效。谢谢,Eric Postpischil获得了很好的评价。
答案 1 :(得分:3)
6.5.6加法运算符
8 ...如果表达式P
指向 数组对象的 i -th元素,表达式(P)+N
(等效地,N+(P)
)和(P)-N
(其中N
的值 n )分别指向 i + n -th和 i-n-的元素 数组对象如果它们存在 ....
强调我的。因此,在您的具体示例中,p[-1]
有效,因为它指向a
的现有元素;但是,a[-1]
不无效,因为a[-1]
指向不存在的a
元素。同样,p[-4]
无效,a[10]
无效,等等。
答案 2 :(得分:2)
当然有效。
(C99,6.5.2p1)“其中一个表达式的类型''指向对象类型'',另一个表达式应该是整数类型,结果类型为''type''。
答案 3 :(得分:1)
通常使用这样的负面指数是Bad Idea(TM)。但是,我找到了一个有用的地方:trig查找表。对于这样的查找表,我们需要使用一些角度测量作为索引。例如,我可以使用度数作为索引,为-180度和+180之间的角度索引sin
值。或者,如果我想使用辐射,我可以使用PI的一部分的倍数,比如PI/3
,作为索引。然后,我可以cos
和-PI
之间的PI
值获得PI/3
的倍数。
答案 4 :(得分:-2)
是的,这是合法的,因为C允许你整天做不安全的指针算术。但是,这很令人困惑,所以不要这样做。另请参阅this answer to the same question。