一道指针压轴笔试题讲解 (进阶指针必看)

今天我来给大家讲解一道指针压轴笔试题,同时也是进阶指针知识必会的一道题。相信大家在认真梳理清楚这道题后,对指针的知识了解定会更上一层楼 ~ 

话不多说,上题目 :

请问程序输出结果是什么 ?

 相信大家一拿到题目必定是懵逼的,下面我就来给大家仔细讲解梳理一遍这道压轴笔试题 :

讲解:

要做出这道题,我们必须先掌握几个知识点 : 

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 ,是否解引用*访问了空间后再操作,以及指针指向是否改变,稍不留神,便会出错。 

 

 

其次,我们要画出内存布局,一步一步分析,防止步骤太多弄混而出错 。

 

至此,压轴题目讲解完毕,弄清楚这道题,相信大家能在进阶指针知识的学习道路上收获良多。

觉得文章对自己有所帮助,欢迎大家多多点赞收藏,这是对博主最大的鼓励  !(抱拳~ )

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值