目录
前言
1、题目
2、答案
3、解析
结语
前言
“纸上得来终觉浅,绝知此事要躬行”。本篇通过对指针实际案例的分析,由浅入深,来加强我们对指针的理解。
1、题目
这是一道难题,小心哦。
#include <stdio.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);return 0;
}
这里先附上操作符优先级,这个是要记住的:
请通过自己的方法解出此题,后面公布答案,对比一下。
2、答案
答案为:POINT ER ST EW
此题很难,涉及到很多细节上的知识点,如果能够搞懂的话,说明你对指针的了解已经到了一定高的境界。下面看解析。
3、解析
上面是cpp cp c 之间的关系。
对于 **++cpp;先对cpp+1指向下一个地址也就是cp中的第二个元素:c+2。然后对其经行两次解引用,第一次解引用得到c+2,第二次解引用得到c+2的指向的内容(c的第三个元素)POINT,于是打印出“POINT”。计算完后,现在的三个指针的情况如下:
对于 *-- * ++cpp + 3; 先运算++cpp,因为在上面进行了一次++cpp运算,这是第二次++cpp,所以指向cp第三个元素c+1,然后解引用得到cp[2],此时再运算--,得到指向c的指针,并存放到cp[2]里面,cp[2]变成了指向c的指针。再解引用得到c,c指向"ENTER",c+3指向"ER",因此打印出来为"ER"。此次输出完成,三个指针情况如下:
下面输出:*cpp[-2]+3; 首先cpp和[-2]结合,得到cp第一个元素,也就是c+3,然后解引用c+3得到指向"FIRST"的指针,再+3得到指向"ST"的指针,最后输出为"SE"。这次运算没有改变三个指针的指向。现在三个指针还是如下:
最后分析:cpp[-1][-1] + 1;首先cpp[-1]结合得到c+2。然后再和[-1]结合得到c+1指向的内容"NEW"。最后,+1,指向"EW"。输出为"EW"。
结语
本题讲解完毕,此题值得我们去细细琢磨,在这样的练习中提升我们对指针的理解。