通过一个题来进一步理解指针

首先看题

我们现在来分析,这个题的答案是怎么来的

1.首先c是一个指针数组,数组里面有4个元素,每个元素的类型是char* ,cp是一个二级指针,也是一个指针数组,里面的元素从左到右依次是"FRIST"、"POINT"、"NEW"、"ENTER",cpp是一个三级指针,下面请看图片分析他们的对应关系

现在看第一个printf,括号里面先是对cpp做自加运算,运算以后cpp就指向cp里面的c+2,**++cpp中第二颗*表示对自加运算以后的cpp解引用,拿到了c+2的地址,c+2指向的是c里面的第三个元素的地址,然后在对该元素解引用就得到了P的地址,然后%s打印出来就是POINT

2.我们再来看第二个printf,括号里面是*--*++cpp+3,这里++、*、--的优先级高于+所以先算++cpp,因为第一个printf已经操作过cpp了,现在的cpp指向的是c+2。看图

 *--*++cpp+3,++cpp现在指向c+1,解引用,拿到c+1里面的内容,也就是地址,--操作c+1变成了c,c的话就该指向c指针里面的第一个元素,在解引用拿到了E的地址,+3拿到E的地址,%s打印出来就是ER。

3.我们再来看第三个printf,括号里面是*cpp[-2]+3等价于*(*(cpp-2))+3,现在的cpp经过前两个printf的操作现在指向c+1,cpp-2指向c+3,解引用拿到c+3里面的内容,也就是地址,对应c里面第四个元素,再解引用,拿到F的地址,+3拿到S的地址,%s打印出来就是ST

4.我们再来看第四个printf,括号里面是cpp[-1][-1]+1等价于*(*(cpp-1)-1)+1,经过前三次的操作,现在的cpp指向c+1,cpp-1就指向了c+2,解引用就拿到了c+2里面的内容,-1就拿到了c指针里面第二个元素的内容,然后在解引用拿到了N的地址,+1%s打印出来就是EW。

上面就是整个解题的过程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咸鱼吐泡泡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值