You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言函数传入二级指针时后置++与增量赋值的行为差异疑问

问题核心原因:C语言运算符优先级差异
  • 首先明确运算符优先级规则:C语言中后置自增运算符++的优先级高于解引用运算符*,这是两种写法表现不一致的根本原因。
  • 原写法*ptr++的实际执行逻辑:
    该表达式等价于*(ptr++),执行顺序是:
    1. 先对二级指针形参ptr(是main中&ptr的值拷贝,属于函数栈上的临时变量)做后置自增,修改的是临时副本本身的地址
    2. 对自增前的ptr做解引用操作,得到main中原有ptr的指向值,但整个表达式没有赋值操作,所有修改没有对main中的指针产生任何实际影响。因此原代码的两次foo调用属于无效操作,运行后会输出完整的Hello World!。
  • 修改后写法*ptr = *ptr + 1的执行逻辑:
    该表达式执行顺序是:
    1. 先对形参ptr做解引用,得到main中char *ptr变量的取值(也就是malloc分配的内存起始地址)
    2. 将该地址值按char类型步长偏移1字节
    3. 重新赋值给*ptr,直接修改了main中char *ptr的指向
      因此每调用一次foo,main中的指针就向后偏移1字节,两次调用后偏移2字节,正好指向原字符串的第三个字符l,输出llo World!符合预期。
  • 补充验证:如果要使用自增运算符实现相同效果,只需通过括号改变运算顺序,将*ptr++改为(*ptr)++即可,该写法会先解引用得到main中的指针变量,再对其做自增操作,和增量赋值效果完全一致。

内容的提问来源于stack exchange,提问作者asevindik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 09:24:03