*(arr -1) 与 arr[-1] 相同吗?

Dan*_*ida 2 c

我正在尝试解决这个问题,它有一个向量,并且有一个导致负索引的指针。我想知道 C 是否会忽略它并将其视为正数,或者它在向量中向后移动,例如 -1 是数组的最后一个元素。

Ste*_*mit 5

是的,你可以有负索引。这是根据 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 */

}
Run Code Online (Sandbox Code Playgroud)

正如评论所示,最后一行是错误的。它尝试访问数组之外​​的内存arr。它将打印“随机”垃圾值,或者理论上它可能会崩溃。