题目:
#include<stdio.h>
#include<stdlib.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);
system("pause");
return 0;
}
首先解这道题需要我们先画一个内存图来帮助理解
首先是这个代码**++cpp
cpp最初保存的是cp的首元素地址 :0xB00
++(跳过一个元素) 得到0xB04
*操作 得到0xA08
*操作 得到0x300
printf(”%s“,0x300)得到PONIT
第二个代码*--*++cpp + 3
此时cpp保存的地址:0xB04
++ 得到0xB08
*操作得到0xA04
–得到0xA00
*操作得到0x100
+3 得到0x103
打印出来结果为ER
第三个代码*cpp[-2] + 3)
cpp此时保存的地址为0xB08
[-2] 减2再解引用 得到 0xA0C
*操作得到0x400
+3得到0x403
打印出来结果为ST
第四个代码cpp[-1][-1] + 1
最初的cpp :0xB08
[-1]:0xA08
[-1] :0x200
+1 0x201
打印出来为EW
验证一下: