目录

前言

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;
}

       这里先附上操作符优先级,这个是要记住的:笔试题讲解(C语言进阶)-LMLPHP

        请通过自己的方法解出此题,后面公布答案,对比一下。

2、答案

        笔试题讲解(C语言进阶)-LMLPHP

        答案为:POINT        ER        ST        EW

        此题很难,涉及到很多细节上的知识点,如果能够搞懂的话,说明你对指针的了解已经到了一定高的境界。下面看解析。

3、解析

笔试题讲解(C语言进阶)-LMLPHP        上面是cpp   cp   c 之间的关系。

        对于  **++cpp;先对cpp+1指向下一个地址也就是cp中的第二个元素:c+2。然后对其经行两次解引用,第一次解引用得到c+2,第二次解引用得到c+2的指向的内容(c的第三个元素)POINT,于是打印出“POINT”。计算完后,现在的三个指针的情况如下:笔试题讲解(C语言进阶)-LMLPHP

        对于  *-- * ++cpp + 3; 先运算++cpp,因为在上面进行了一次++cpp运算,这是第二次++cpp,所以指向cp第三个元素c+1,然后解引用得到cp[2],此时再运算--,得到指向c的指针,并存放到cp[2]里面,cp[2]变成了指向c的指针。再解引用得到c,c指向"ENTER",c+3指向"ER",因此打印出来为"ER"。此次输出完成,三个指针情况如下:

笔试题讲解(C语言进阶)-LMLPHP

        下面输出:*cpp[-2]+3;  首先cpp和[-2]结合,得到cp第一个元素,也就是c+3,然后解引用c+3得到指向"FIRST"的指针,再+3得到指向"ST"的指针,最后输出为"SE"。这次运算没有改变三个指针的指向。现在三个指针还是如下:笔试题讲解(C语言进阶)-LMLPHP

        最后分析:cpp[-1][-1] + 1;首先cpp[-1]结合得到c+2。然后再和[-1]结合得到c+1指向的内容"NEW"。最后,+1,指向"EW"。输出为"EW"。

结语

        本题讲解完毕,此题值得我们去细细琢磨,在这样的练习中提升我们对指针的理解。

02-24 06:38