今天我来给大家讲解一道指针压轴笔试题,同时也是进阶指针知识必会的一道题。相信大家在认真梳理清楚这道题后,对指针的知识了解定会更上一层楼 ~
话不多说,上题目 :
请问程序输出结果是什么 ?
相信大家一拿到题目必定是懵逼的,下面我就来给大家仔细讲解梳理一遍这道压轴笔试题 :
讲解:
要做出这道题,我们必须先掌握几个知识点 :
1.
这个代码的意思是 把4个常量字符串的首字符地址存到c数组里面,每个元素的类型是 char*
2.
把char*的地址再存到类型为char** 的数组 cp中 ,c+1为跳过一个元素,指向下一个元素,以此类推
3.
cpp代表数组cp首元素(char **)的地址 ,类型为 char ***
下面给大家画出内存布局,以供大家更好地想象 :
输出代码逐句分析 :
1.
前置++,先++,再使用。 所以cpp指向啦 c+2 再解引用* 找到 c中的 c+2,再解引用*,找到POINT 中 P的地址 ,以%s形式打印,所以打印的内容是 POINT ,遇到 \0 停止打印 。
2.
同理,前置++,先++,再使用。上句代码cpp指向位置改变了,指向c+2,这次再++,指向c+1,解引用找到cp中c+1这块空间,--,c+1的值变成了c ,解引用*,找到c数组中c的空间,+3,因为类型是char*,所以指针向后移动3个字节,也就是ENTER中的E,以%s形式打印,打印出的就是 ER,遇到 \0 停止打印
3.
cpp[-2]也可以写成 *(cpp-2), *cpp[-2]+3 可以写成 *(*(cpp-2)+3)
这里注意区分理解:解引用找到空间后的 --/++ ,改变的是c的值,没解引用*找到空间的 ++/--/+1/-1,都是指针指向变化,空间里面的值没有改变
++/--是cpp本身指向改变了 ,而 -1/+1 cpp本身指向不改变,只是暂时改变了去找到对应空间访问打印,打印完本身指向是没改变的
( 左值是空间,右值是内容 )
cpp-2 变成了 char** c+3那块空间,解引用*找到 char* 中FIRST的空间,+3指针指向从F变为S,解引用*打印 ,遇到 \0 停止 ,即打印的内容是 ST
4.
同理可得,cpp[-1][-1]可以写成 *(*(cpp-1) -1 )
总的表达式就可以写成 *(*(cpp-1) -1 )+1
因为cpp指向没有因为上式而改变,依旧指向char** cp 的第三块空间
cpp-1指向 char** cp 的第二块空间,解引用找到 char * c的第三块空间,-1再找到 char* c的第二块空间,也就是 NEW 的空间,解引用*访问,+1 类型为char * 跳过一个字符从E开始打印,遇到 \0 停止,所以打印内容是 EW
总结 :
要顺利梳理清楚这道指针压轴题,我们就要深刻理解运算符的优先级,以及 ++/-- 与 +1/-1 ,是否解引用*访问了空间后再操作,以及指针指向是否改变,稍不留神,便会出错。
其次,我们要画出内存布局,一步一步分析,防止步骤太多弄混而出错 。
至此,压轴题目讲解完毕,弄清楚这道题,相信大家能在进阶指针知识的学习道路上收获良多。
觉得文章对自己有所帮助,欢迎大家多多点赞收藏,这是对博主最大的鼓励 !(抱拳~ )