可能重复:
我可以在数组中使用负索引吗?
#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;
}
发布于 2012-10-06 02:22:19
是的,-1
在这个上下文中是有效的,因为它指向分配给char a[]
数组的内存中的有效位置。p[-1]
等同于*(p-1)
。按照示例中的赋值链,它与有效的a+3-1
或a+2
相同。
EDIT :一般规则是,整数和指针(通过扩展,指针上的等效索引操作)的加/减操作需要生成指向相同数组或数组末尾之外的一个元素的结果,才能有效。谢谢你,Eric Postpischil,你的留言太棒了。
发布于 2012-10-06 02:39:04
6.5.6加法运算符
8 ...if表达式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-06 02:21:40
它当然是有效的。
(C99,6.5.2p1)“其中一个表达式的类型应为‘’指向对象类型的指针‘’,另一个表达式的类型应为整数类型,结果的类型为‘’类型‘’。
https://stackoverflow.com/questions/12751918
复制相似问题