题目:
int main()
{
char* a[] = { "ENTER","NEW","POINT","FIRST" };
char** pa[] = { a + 3,a + 2,a + 1,a };
char*** paa = pa;
printf("%s\n",**++paa);
printf("%s\n", *-- * ++paa + 3);
printf("%s\n", *paa[-2] + 3);
printf("%s\n", paa[-1][-1] + 1);
return 0;
}
首先,我们要搞明白地址的分配;
a先和[]结合,代表是一个数组,数组的每个类型是char*
型,画图理解就是这样:
;然后可推理pa:
,整合起来就是这样:
写到这里,就基本上懂一半啦
然后根据题意:paa所存的地址就是a+3的这·个地址,把所有地址连起来就是这样:
先看第一个**++paa
:先算++paa,此时paa指向a+2
先解引用一次,指向第三个char*
,再解引用一次,指向“POINT”。打印出来就是 POINT
啦。
再看*-- * ++paa + 3
:老样子,和上面一样判断,先判断++paa
,此时paa
存着a+1
的地址,再解引用,指向第二个char*
,还有一个 “--” ,指向第一个char*
,再解引用,指向E的地址,外面还有个+3,指向“ENTER”的第二个E,画图就是这样子的:
这样就解决啦,只要弄清楚地址,是不是就很简单滴捏? 所以打印出来的是
ER
。
再来看第三个,*paa[-2] + 3
:解释这个就要先了解知道paa[-2]
是等价于*(paa-2)
的,所以这个式子可以写成**(paa-2)+3
,老规矩,先分析;此时paa
存着a+1
的地址,paa-2
,就变成了存着a+3
的地址了,解引用一次。指向a+3
,再解引用一次,指向第四个char*
,然后再解引用一次,指向“FIRST",别忘记外面还有个+3
哦 ,和上面一样的道理,画图就是这种样子:
所以打印出来 ST
啦 。
紧接着,我们来看paa[-1][-1] + 1
:首先第一步,和上面一样,我i们要先转换paa[-1][-1]
,会上面这题,那么我感觉这题也没多大问题,这个可以转换成*(*(paa-1)-1)
,此时paa
存着a+1
的地址,所以paa-1
就是存着的a+2
的地址啦,然后解引用,指向a+2
,还有个-1
,所以a-2
里存着的就是第二个char*
的地址了,再解引用一次,指向 NEW
,但是外面的+1
不能忘记,此时指向的是 E
啦,图如下:
所以打印出来的就是 EW
啦。
所有的打印出来就是这个样子: