解释以下程序的o / p

时间:2015-11-02 08:23:34

标签: c++ c pointers

解释以下程序的o / p。

int main()
{
    int a [2][3] = {5,10,15,20,25,30}; 
    int (*p) [2][3] =&a;
    printf ("%d\t", ***(p+1)); 
    printf ("%d\t", ***p); 
    printf ("%d\t", ** (*p+1));
}

输出: -

Garbage, 5,20?

1 个答案:

答案 0 :(得分:3)

p是指向大小为[2][3]的2D rray的指针。

1)p+1这会增加p以跳转到其类型的下一个变量,即大小为[2][3]的2D数组。由于此地方尚未分配,因此超出了数组a。所以,它的未定义行为,所以只给它提供垃圾值..

2)***p只是取消引用指针并转到第一个值5

3)要了解最后一个是如何工作的,您需要了解阵列解除引用的工作原理。 a[1][0]实际上变为*(*(a+1) + 0),因此会给出值20。因此,p&a,因此*pa。现在用a替换*(*(a+1) + 0)中的*p。那就是第三个答案是什么