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

