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

C++指针传参时*n++无法自增而*n+=1正常运行的原因是什么

C++ 中*n++不生效、*n += 1生效的核心原因

核心问题是C++运算符优先级规则导致两种写法的实际执行逻辑完全不同:

  • 后置自增运算符++的优先级高于解引用运算符*,而复合赋值运算符+=的优先级低于解引用运算符*。

两种写法的实际执行逻辑

1. *n++的实际执行逻辑

编译器会按照优先级将其解析为*(n++),执行顺序为:

  1. 记录指针n当前存储的原始地址
  2. 指针n本身自增,指向后一个同类型的内存地址
  3. 对第一步记录的原始地址做解引用,得到指向变量的值,但整个表达式没有对该值做修改操作
    因此你想修改的指向变量完全不会变化,反而指针n本身被偏移了,这就是你观察到自增未生效的原因。
    如果要通过后置自增修改指针指向的变量,正确写法是加括号强制优先级:(*n)++,先解引用拿到指向的变量,再对变量做自增。

2. *n += 1的实际执行逻辑

编译器优先计算优先级更高的解引用操作*n,直接拿到指针指向的变量,再对该变量执行加1的赋值操作,完全符合你预期的修改逻辑,所以可以正常生效。


代码示例验证

int val = 5;
int* n = &val;

*n++; 
// 执行后val仍为5,n不再指向val
*n += 1; // 如果此时n已经偏移,这行甚至会触发未定义行为

// 正确修改val的写法
int* p = &val;
(*p)++; // val变为6
*p += 1; // val变为7

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 17:27:01