一道考你指针功底的程序题。

#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">
经验分享 程序员 微信小程序 职场和发展