#include<stdio.h>
int main(){
int a1[]={6,7,8,18,34,67};
int a2[]={23,56,28,24};
int a3[]={-12,27,-31};
int *y[]={a1,a2,a3};
int **a= y;
printf("%d\n",a[0][2]);
printf("%d\n",*a[2]);
printf("%d\n",*(++a[0]));
printf("%d\n",*(++a)[0]);
printf("%d\n",a[-1][1]);
return 0;
}
当我运行上面的代码时,输出是8,-12,7,23,8。但如果我将最后 3 行更改为
printf("%d\n",*(++a[2]));
printf("%d\n",*(++a)[1]);
printf("%d\n",a[-1][1]);
输出为8,-12,27,27,7。我无法理解最后一条 printf 语句。 a[-1][something] 是如何计算的?根据我的说法, *(++a)[1]
应该打印 56 而不是 27 !
最佳答案
指针和数组基址实际上是虚拟内存中的地址。在C中,它们可以被计算成新的地址。由于编译器知道指针指向的内存大小(例如 int * 指向 4 字节),因此指针 +/- 1 表示地址 +/- 大小(例如 int 为 4 字节)。
运算符*表示获取指定地址中存储的值。
这里的另一个技巧是运算符的优先级。 []在++之前计算。
如果您理解我上面的意思,您的问题应该得到解决。
关于c - C 指针数组中的负索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47707689/