指向[-1]数组索引的指针

man*_*m-n 12 c c++ arrays pointers

指针如何指向[-1]数组的索引每次都会产生合法的输出.指针赋值实际发生了什么?

#include<stdio.h>
int main()
{
        int realarray[10];
        int *array = &realarray[-1];

        printf("%p\n", (void *)array);
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

代码输出:

manav@workstation:~/knr$ gcc -Wall -pedantic ptr.c
manav@workstation:~/knr$ ./a.out
0xbf841140
Run Code Online (Sandbox Code Playgroud)

编辑:如果这种情况有效,那么我可以用它来定义一个索引从1开始而不是0的数组,即:array [1],array [2],...

unw*_*ind 13

您只需获取一个包含该"虚构"位置地址的指针,即第一个元素的位置&realarray[0]减去一个元素的大小.

这是未定义的行为,例如,如果您的计算机具有分段内存架构,则可能会出现严重破坏.这是有效的,因为编译器编写者选择实现上面概述的算法; 随时可能发生变化,而另一个编译器的行为可能完全不同.

  • 是否应该为`int*p = realarray + 5; int*q = p-6;`?在C中,你必须进行边界检查.:-) (4认同)

Let*_*_Be 9

a[b] 被定义为 *(a+b)

因此a[-1]*(a-1)

是否a-1为有效指针,因此取消引用有效取决于使用代码的上下文.