#include<stdio.h>
char *c[] = {"ENTER","NEW","POINT","FIRST"};
char **cp[] = {c+3, c+2, c+1, c};
char ***cpp = cp;
int main()
{
printf("%s
", **++cpp);
printf("%s
",*--*++cpp+3);
printf("%s
", *cpp[-2]+3);
printf("%s
", cpp[-1][-1]+1);
return 0;
这个题还是比较严肃的,就不偏闲的了。
下图 为此题的逻辑 和关系图
解释 *c[] 为 存放 char* 类型 的 指针数组。
**cp[] 为指向 *C 的指针 指向首元素地址。
此 代码逻辑严谨 请仔细分析。
1. **++cpp
解读 (++cpp) cpp指针向后移动 1*sizeof(char **) 字节 (后面省略sizeof(type)) **注意此处++cpp 存在的隐患 指针停留在了 CP 的第二个位置上
*(++cpp) 解引用 去cp数组里面的 C+2
*(*(++cpp)) 再一次解引用 即 *(c+2) == c 中 c[2] 中的 char* ==POINT
2. <span style="font-family: Arial, Helvetica, sans-serif;">*--*++cpp+3</span>
<span style="font-family: Arial, Helvetica, sans-serif;"> (++cpp) cpp指针又向后偏移一次 指向了第三个位置 对第三个位置解引用 得要值 *</span><span style="font-family: Arial, Helvetica, sans-serif;">(++cpp)==c+1 </span>
<span style="font-family: Arial, Helvetica, sans-serif;"> 接着 --*(++cpp) 是对所取的值 -- 成为 c 再接着解引用 *(--*(++cpp)) 取到C中 a[0] 位置的char* 指向了ENTER </span>
<span style="font-family: Arial, Helvetica, sans-serif;"> 再向后加 3 即是这个位置的 char* 指向首元素 E 向后偏移3位 输出%s ER</span>
<span style="font-family: Arial, Helvetica, sans-serif;">3.</span><span style="font-family: Arial, Helvetica, sans-serif;">*cpp[-2]+3</span>
<span style="font-family: Arial, Helvetica, sans-serif;"> cpp[-2] == *(cpp-2) 指针向回移动两个位置 即指向了cp的处世地址,取c+3</span>
<span style="font-family: Arial, Helvetica, sans-serif;"> *(*(cpp-2)) 再 对c+3 解引用 指向a[3] 里面的char* FIRST 同2,向后加3 输出 _________。自己试</span>
4.cpp[-1][-1]+1 == *(*(cpp-1)-1)+1
<span style="color:#ff0000;">不服自己算啊 !</span>
<span style="font-family: Arial, Helvetica, sans-serif;">
</span><pre name="code" class="cpp">