#include <stdio.h>
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;
}
求打印的内容
目录
初始化:
char *c[] = {"ENTER", "NEW", "POINT", "FIRST"};
char** cp[] = {c+3, c+2, c+1, c};
char*** cpp = cp;
c[]
是字符指针数组,包含了四个字符串指针:
c[0]
->"ENTER"
c[1]
->"NEW"
c[2]
->"POINT"
c[3]
->"FIRST"
cp[]
是字符指针数组,包含四个元素,指向 c[]
中的不同位置:
cp[0]
->c + 3
,即c[3]
,指向"FIRST"
cp[1]
->c + 2
,即c[2]
,指向"POINT"
cp[2]
->c + 1
,即c[1]
,指向"NEW"
cp[3]
->c
,即c[0]
,指向"ENTER"
cpp
是char***
类型,指向cp[]
数组。
**++cpp
:
printf("%s\n", **++cpp);
- 初始时,
cpp
指向cp[0]
,即c+3
,指向"FIRST"
。 ++cpp
使cpp
移动到cp[1]
,即c+2
,指向"POINT"
。*cpp
解引用后得到c+2
,即指向"POINT"
。**cpp
再次解引用得到"POINT"
。
所以,printf("%s\n", **++cpp);
输出 "POINT"
。
*--*++cpp + 3
:
printf("%s\n", *--*++cpp+3);
++cpp
使cpp
移动到cp[2]
,即c+1
,指向"NEW"
。*cpp
解引用得到c+1
,即指向"NEW"
。--*cpp
使指针c+1
向前移动一个位置,指向c[0]
,即"ENTER"
。*--*cpp
解引用得到"ENTER"
。*--*cpp + 3
将"ENTER"
的指针移动三个字符,指向"ENTER"
中的第四个字符,即"ER"
。
所以,printf("%s\n", *--*++cpp + 3);
输出 "ER"
。
*cpp[-2] + 3
:
printf("%s\n", *cpp[-2]+3);
在这里我们先将以上表达式化简一下,方便理解
printf("%s\n", **(cpp - 2) + 3);
cpp[-2]
是cp[0]
,即c+3
,指向"FIRST"
。*cpp[-2]
解引用得到c+3
,即指向"FIRST"
。*cpp[-2] + 3
将指针向后移动三个字符,指向"FIRST"
中的第四个字符,即"ST"
.
cpp[-1][-1] + 1
:
printf("%s\n", cpp[-1][-1]+1);
我们还是按照惯例化简一下便于理解
printf("%s\n", *(*(cpp - 1) - 1) + 1);
cpp[-1]
是cp[1]
,即c+2
,指向"POINT"
。cpp[-1][-1]
是*cpp[-1]
的第一个元素,等同于*c+2
,即指向"POINT"
。cpp[-1][-1] + 1
将"POINT"
的指针移动一个字符,指向"POINT"
中的第二个字符"EW"
.
所以,printf("%s\n", cpp[-1][-1] + 1);
输出 "EW"
。
//最终输出
POINT
ER
ST
EW