//解释这段代码的输出,特别是不能理解最后的printf输出......请解释
int a1[]={6,7,8,18,34,67};
int a2[]={23,56,28,29};
int a3[]={-21,27,-31};
int *x[]={a1,a2,a3};
void print(int *a[])
{
printf("%d",a[0][2]); // outputs 8
printf("%d",*a[2]); //outputs -21
printf("%d",*++a[0]); //outputs 7
printf("%d",*(++a)[0]); //outputs 23
printf("%d",a[-1][+1]); /*outputs 8 explain?*/
}
main()
{
print(x);
return(0);
}
答案 0 :(得分:0)
请记住,a是指向指针的指针,可能会被更改,它不是与数组x相同的对象,它只是指向该数组的第一个元素。对于数组x的元素也是如此:x [0],x [1]和x [2]是指向数组a1,a2,a3的第一个元素的指针。
在最后一个printf行之前,指针a指向数组x的第二个元素,它是指向数组a2的指针。造成这种情况的原因是第四个printf行,它将指针a递增一个。
然后我们走进最后一条printf线。
第一个下标[-1]
递减指针a,结果现在指向数组x的第一个元素,它是指向数组a1的指针。取消引用给出了该指针的值。由于第三个printf行,该指针指向数组a1的第二个元素。
第二个下标[1]
检索数组a1的第三个元素。