解释这段代码的输出?

时间:2016-09-11 07:48:52

标签: c arrays pointers

//解释这段代码的输出,特别是不能理解最后的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);
}

1 个答案:

答案 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的第三个元素。