int main()
{
char *c[] = {"ENTER","NEW","POINT","FIRST"};
char**cp[] = {c+3,c+2,c+1,c};
char***cpp = cp;
printf("%s\n", **++cpp);
printf("%s\n", *--*++cpp+3);
printf("%s\n", *cpp[-2]+3);
printf("%s\n", cpp[-1][-1]+1);
return 0;
}
答案:POINT ER ST EW
解析:
我们逐行分析代码的含义:
char *c[] = {"ENTER","NEW","POINT","FIRST"};
:定义了一个字符串指针数组c
,其中包含了4个字符串常量。char**cp[] = {c+3,c+2,c+1,c};
:定义了一个指向指针的指针数组cp
,其中包含了4个指针,指向数组c
中的不同元素。char***cpp = cp;
:定义了一个指向指针的指针的指针变量cpp
,指向数组cp
的首元素。printf("%s\n", **++cpp);
:打印cpp
指向的指针的指针所指向的字符串,输出为POINT
。++cpp
会使cpp
指向数组cp
的下一个元素,即cp[1]
,**++cpp
解引用两次指针,相当于*(*(cpp+1))
,得到"POINT"
。printf("%s\n", *--*++cpp+3);
:打印cpp
指向的指针的指针所指向的字符串,经过一系列的指针运算,输出为ER
。++cpp
会使cpp
指向数组cp
的下一个元素,即cp[2]
,*++cpp
解引用一次指针,得到c+1
,即指向字符串"NEW"
的指针。--*++cpp
先解引用指针,再对指针进行递减操作,相当于*(--(*(cpp+2)))
,得到c+1-1
,即指向字符串"NEW"
的指针,再加上3
,得到字符串"ER"
。printf("%s\n", *cpp[-2]+3);
:打印cpp
指向的指针的指针所指向的字符串,输出为ST
。cpp[-2]
相当于*(cpp-2)
,即cp[0]
,解引用后得到c+3
,即指向字符串"FIRST"
的指针,再加上3
,得到字符串"ST"
。printf("%s\n", cpp[-1][-1]+1);
:打印cpp
指向的指针的指针所指向的字符串,输出为EW
。cpp[-1]
相当于*(cpp-1)
,即cp[3]
,解引用后得到c
,即指向字符串"ENTER"
的指针,再进行[-1]
操作,得到字符串"EW"
。