下面程序执行结果为【说明:X86_64环境】
int main(void)
{
int a[4][4] = {
{1,2,3,4},
{50,60,70,80},
{900,1000,1100,1200},
{13000,14000,15000,16000} };
int (*p1)[4] = a;
int (*p2)[4] = &a[0];
int *p3 = &a[0][0];
printf("%d %d %d %d\n",*(*(a+1)-1),*(*(p1+3)-2)+1,*(*(p2-1)+16)+2,*(p3+sizeof(p1)-3));
return 0;
}
A、16000 1101 13002 2
B、4 2 3 60
C、16000 2 3 2
D、4 1101 13002 60
解析:
*(*(a+1)-1) 其中a+1中的1代表维数,a+1实际上指向第二行首元素地址,*(a+1)则是取出地址,(*(a+1)-1)则是指向前一个元素,即第一行最后一个元素,*(*(a+1)-1) 取出该元素值,为4;
*(*(p1+3)-2)+1 其中p1+3指向第四行首元素的地址,*(p1+3)取出该地址,*(p1+3)-2指向前一个元素的前一个元素,*(*(p1+3)-2)+1取出该元素,并将其值加1;
*(*(p2-1)+16)+2 其中p2-1中的1指的是维数,需要向前退4个元素地址,*(p2-1)取出该地址,*(p2-1)+16向后进16个元素地址,即指向13000,*(*(p2-1)+16)+2取出该元素值,并加2;
*(p3+sizeof(p1)-3) 其中sizeof(p1)为8,因为是64位机,p3+sizeof(p1)-3指后进5个元素地址,指向60,*(p3+sizeof(p1)-3)取出该元素值;