解释以下程序的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?
答案 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
,因此*p
为a
。现在用a
替换*(*(a+1) + 0)
中的*p
。那就是第三个答案是什么