C语言中*ptr++与数组元素自增的区别及执行逻辑疑问
为什么
*ptr++是遍历数组而非自增当前元素? 这是个非常经典的C运算符优先级和结合性问题,我给你一步步拆解背后的逻辑:
首先得明确两个核心关键点:
- 后缀
++的优先级高于解引用运算符* - 后缀
++的特性是:先使用变量当前的值,再对变量进行自增
分步解析*ptr++的执行流程
当你在代码里写*ptr++时,编译器会严格按以下顺序执行:
- 先处理后缀
++:但因为是后缀形式,它会先返回ptr当前的地址值(也就是指向array[0]的内存地址),此时ptr本身还没发生自增。 - 再对这个返回的地址执行解引用
*:读取该地址对应的数值,也就是array[0]的9,这就是printf最终打印的内容。 - 等整个表达式(
*ptr++)求值完成后,才会触发后缀++的副作用:把ptr的地址自增,让它指向数组的下一个元素array[1]。
对比你误解的情况:如何实现array[0]++?
如果你想让当前元素的值自增(比如把array[0]从9变成10),需要用括号改变优先级,写成(*ptr)++:
- 括号让解引用
*先执行:先通过ptr拿到array[0]的数值。 - 再对这个数值执行
++,完成自增操作。
结合你的代码走一遍第一次循环
- 初始状态:
ptr指向array[0],count=0。 - 执行
printf(" %d", *ptr++);:- 先获取
ptr当前的地址(&array[0]),解引用得到9,打印出来。 - 随后
ptr自增,指向array[1]。
- 先获取
- 第二次循环时,
ptr已经指向array[1],重复上述步骤,打印8,以此类推,最终遍历整个数组。
内容的提问来源于stack exchange,提问作者YUMI
相关产品推荐
相关产品推荐

