C语言关于指针移动的学习笔记

作为C语言初学者,最早是在单片机开发时遇到这个 *p++ 的,确实有点搞不清楚。首先是查询运算符优先级

不巧的是p两边的运算符是同一优先级的,而且写的是从右向左结合,从右向左的字面意思当然是先++(指针指向下一单元地址),再取值(解引用)了

 遇到想不明白的,一般测试一下就清楚多了,所以写了下面几句,结果如下:

 

 

声明指向字符串常量的指针开始就指向a,如果按上面的理解,指针先移动,那么第一个打印出来的应该是b,既然a被打印出来就说明实际是先运算了“*”

 下一步试着强制先移动指针,于是把p++用括号括起来,再运行

 

 

果然还是这个鸟样子,说明上面提到的“从右向左结合”没有骗我,原来不加这个括号也是一样的

这里其实没必要纠结字面意思应该怎么理解。反正我们要实现的无非就是两种操作,要么先取值再移动指针,要么先移动指针再取值。前者已经实现,后者的话,从优先级列表里就能看出来,用++p就可以了。试一下果然没错

 

 

不过我还是比较好奇,回到最开始的问题,既然p和++括起来没什么影响,那么*和p括起来呢?虽然有点讨厌不过还是试一下:

 

 

程序编译没问题,但是运行时出错了。不加括号时,*p++相当于*p; p++,而(*p)++相当于先取值得到a,然后把a这个常量加1,而常量占用的内存应该是不允许被修改的

 

转载于:https://www.cnblogs.com/soleputty/p/10226548.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值