今天看到一道题目,研究了好一会儿终于高明白了,在这里拿出来和大家分享一下:
大家可以先行计算一下。
#include <stdio.h>
char *c[] = { "ENTER", "NEW", "POINT", "FIRST" };
char **cp[] = { c + 3, c + 2, c + 1, c };
char ***cpp = cp;
int main(void)
{
printf("%s ", **++cpp);
printf("%s ", *--*++cpp + 3);
printf("%s ", *cpp[-2] + 3);
printf("%s\n", cpp[-1][-1] + 1);
return 0;
}
那么究竟输出的结果是什么呢?
POINT ER ST EW
不知道小伙伴们有么有做对
接下来就是对答案的分析:
(1) printf("%s ", **++cpp);//"POINT"
cpp=cp cpp的值就是数组cp的首地址,即存储c+3这块空间的地址。
++cpp 即cpp自加一,cpp的值为存储c+2这块空间的地址
**++cpp 即*(c+2),即POINT的首地址
(2) printf("%s ", *--*++cpp + 3);//ER
++cpp cpp的值为存储c+1这块空间的地址
*++cpp 拿到的就是数组cp的成员c+1
--*++cpp 即--(c+1),数组cp的第三个成员变为c
*--*++cpp+3 即*c+3,就是ER的首地址
(3) printf("%s ", *cpp[-2] + 3);//ST
cpp[-2] 即*(cpp-2),cpp的值为存储c+1这块空间的地址(这块空间里的内容被改成了c),结果就是拿到c+3
*cpp[-2] + 3 即ST的首地址
(4)printf("%s\n", cpp[-1][-1] + 1);//EW
cpp[-1] 即*(cpp-1),cpp的值为存储c+1这块空间的地址(这块空间里的内容被改成了c),结果就是拿到c+2
cpp[-1][-1] 即*((c+2)-1),拿到NEW的首地址