#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声明。如何计算[-1] [某事物]?根据我*(++a)[1]
应该打印56而不是27!
答案 0 :(得分:0)
指针和数组基本上是虚拟内存中的地址。在C中,可以将它们计算为新地址。由于编译器知道指针指向的内存大小(例如int *指向4个字节),指针+/- 1表示地址+/-大小(例如int的4个字节)。
运算符*表示获取存储在指定地址中的值。
这里的另一个技巧是运营商的优先事项。 []在++之前计算。
如果您理解我的意思,那么您的问题应该得到解决。
答案 1 :(得分:0)
根据我的*(++ a)[1]应该打印56而不是27!
++a
递增a
到下一个int *
,因此在指向y [0]等于a1之后,它指向y [1]等于a2。然后[1]
依次指定y [1](即i)之后的下一个int *
。 e。 y [2]等于a3 + 1(由于前面的++a[2]
)。最后,*
指定y [2]指向的int
。 e。 a3 [1]等于27。