一.题目介绍
nt main()
{
char *c[] = {"ENTER","NEW","POINT","FIRST"};。//1
char**cp[] = {c+3,c+2,c+1,c};//2
char***cpp = cp;//3
printf("%s\n", **++cpp);//4
printf("%s\n", *--*++cpp+3);//5
printf("%s\n", *cpp[-2]+3);//6
printf("%s\n", cpp[-1][-1]+1);//7
return 0;
}
二.题目分析
第一句代码中是一个指针数组(存放指针的数组),数组里面四个元素,每个元素的类型为char*。每个指针指向一个字符串,其实就是指向首字符的地址,比如说c[0]中存放的是E的地址,整个字符串可以通过E的·地址找到。
第二句代码中也是一个指针数组,数组里面有四个元素,每个元素的类型为char**,也就是二级指针,二级指针指向一级指针的地址。
第三句代码中是一个三级指针,三级指针指向二级指针数组的首元素(数组名是数组首元素的地址,数组元素为二级指针,指向c+3)。
printf函数会根据打印格式进行判断·,为%s,就按照字符串格式进行打印,找\0
二级指针解引用拿到二级指针内容,一级指针解引用拿到一级指针内容
三.画图分析
1. printf("%s\n", **++cpp);
分析:根据操作符的优先级,++的优先级高于*(解引用),
cpp指向c+3,++cpp,cpp指向c+2,第一次解引用拿到内容c+2,第二次解引用拿到内容P,P后面内容为一个字符串,所以打印
POINT
2. printf("%s\n", *--*++cpp+3);
分析:根据操作符的优先级,++,–的优先级高于*(解引用)
由于++,–会改变自身内容,cp指向c+2,而不是c+3,++cpp指向c+1,解引用拿到内容c+1,再–,注意:这里是对c+1进行–,而不是cpp,–后cp[2]内容变为c,指向发生改变,指向一维数组第一个元素,再次解引用拿到E,按照%s打印,后面还有+3,跳过三个字符,找到E,打印E后面内容。
ER
3. printf("%s\n", *cpp[-2]+3);
分析:这样看不清楚的话,可以理解为
*(*(cpp-2))+3,
cpp指向c+2,cpp-2,cpp指向第一个元素,解引用拿到c+3,
再次解引用拿到F,后面还有一个+3,指向字符串第三个位置S,根据输出格式,打印
ST
4. printf("%s\n", cpp[-1][-1]+1);
分析:理解为:*(*(cpp-1)-1)+1
cpp-1指向c+2,第一次解引用拿到c+2,进行减一操作,指向一维数组第一个元素,元素内容变成c+1,指向关系发生改变,指向第一个元素,解引用后拿到N,字符串加一操作,跳过一个字符,指向E,打印
EW
四.打印验证
以上代码仅供参考 如有错误请大家指点 我会尽快去改正 欢迎大家来评论~~~