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;
}
题目代码见上图;
代码分析:
画图:
执行第一个printf("%s\n", ** ++cpp);
此时 ++cpp 指向 c+2,在对++cpp整体解引用 得到 c+2 所指向的 c列 的第三个 char* 再次解引用 得到该char* 所指向的 POINT
执行第二个printf("%s\n", *-- * ++cpp + 3);
由第一步: 此时cpp已经指向 c+2 在继续进行第二个 : 先 ++cpp 使得cpp指向 c+1 解引用 指向c列第二个char* 再 -- 即指向 c列第一个char* 在解引用 指向 ENTER 的首元素E 然后+3 指向首元素后的第三个元素E 最后打印 ER
执行第三个printf("%s\n", *cpp[-2] + 3);
由第二部:此时cpp已经指向 c+1 再继续进行第三个:cpp[-2] <==> *(cpp - 2) 即cpp先指向 c+3 再解引用 指向 c列第四个char* 再解引用 指向FIRST 的F 再+3 从而指向S 打印出 ST
执行第四个printf("%s\n", cpp[-1][-1] + 1);
注意的是此时cpp还是指向c+1! 为什么呢因为上一步的 cpp-2 并没有改变cpp本身,就好比 int a = 10; int b = a - 2; b = 8; 但 a 任然为10;继续执行第四步:cpp[-1][-1] <==> * ( * (cpp - 1) - 1)
从而指向 NEW 的 N 再+1 指向E 打印 EW!
代码输出结果