我试图解决这个问题,这个问题有一个向量,有一个指向负指数的指针。我想知道C是否忽略了它,并认为它是一个正数,还是它在向量中倒退,就像-1是数组的最后一个元素。
发布于 2022-07-04 14:29:14
是的,你可以有负索引。这源于C中指针算法的定义,即p[i]与*(p + i)完全等价,i是一个负数是完全合法的。
所以,不,这个标志不会被忽略。另外,如果您直接处理一个数组,则没有任何规则规定对数组的末尾进行负索引的计算。如果直接处理数组,则负索引将试图访问数组开头的“左边”内存,这完全违反了规则,导致了未定义的行为。
您可能希望尝试这个说明性的程序:
#include <stdio.h>
int main()
{
int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int *p = &arr[4];
int *endp = &arr[8];
printf("%d %d %d\n", arr[0], arr[4], arr[8]); /* prints "1 5 9" */
printf("%d %d %d\n", p[-1], p[0], p[1]); /* prints "4 5 6" */
printf("%d %d %d\n", endp[-2], endp[-1], endp[0]); /* prints "7 8 9" */
printf("x %d %d x\n", arr[-1], endp[1]); /* WRONG, undefined */
}如注释所示,最后一行是错误的。它尝试访问数组arr之外的内存。它会打印“随机”垃圾值,或者理论上它可能崩溃。
发布于 2022-07-04 14:30:49
与arr-1相同?
是。严格地说,订阅[]操作符的数组定义为arr[n]等价于*( (arr) + (n) )。在本例中:*( (arr) + (-1) )。
或它在向量中向后移动
好的,它向后走,直到到达数组项0,从那里开始访问超出界限的数组。它不会“环绕”索引或类似的东西。示例:
int arr[3] = ...;
int* ptr=arr+1;
printf("%d\n", ptr[-1]); // ok, prints item 0
int* ptr=arr;
printf("%d\n", ptr[-1]); // not ok, access out-of-bounds.发布于 2022-07-04 14:56:10
按照C标准(6.5.2.1数组订阅)
2后缀表达式和方括号[]中的表达式是数组对象元素的下标指定。下标运算符[]的定义是E1E2与(*((E1)+(E2))相同)。由于应用于二进制+运算符的转换规则,如果E1是数组对象(等价地,指向数组对象的初始元素的指针),而E2是整数,则E1E2指定E1的第E2元素(从零计数)。
因此,表达式arr[-1]被计算为与*( arr - 1)相同的*( arr + -1 )。
但是,请注意,arr[-1]与-1[arr]并不相同,因为在方括号之前必须有一个后缀表达式
postfix-expression [ expression ]一元减号运算符的优先级低于protfix表达式。
但是您可以编写与( -1 )[arr]相同的arr[-1]。
https://stackoverflow.com/questions/72858146
复制相似问题