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


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

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

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

 

 

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

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

 

 

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

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

 

 

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

 

 

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

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM