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

为何指针操作中自减运算符(--)与减等运算符(-=1)行为不一致?

为什么*ptr -= 1和*ptr--的行为完全不同?

这两个操作的差异根源是运算符优先级和结合性,下面逐个拆解:

1. *ptr -= 1的行为

对应的代码:

int value = 3;
int *ptr = &value;
printf("%d\n", ptr);
*ptr -= 1;
printf("%d\n", ptr);
printf("%d\n", value);
  • 赋值运算符-=的优先级远低于间接访问运算符*,所以这个语句等价于(*ptr) -= 1。
  • 执行逻辑:先通过*ptr解引用指针,拿到value的内存引用,再对value执行减1操作。
  • 结果:指针ptr的地址完全不变,value的值从3变为2。

2. *ptr--的行为

对应的代码:

int value = 3;
int *ptr = &value;
printf("%d\n", ptr);
*ptr --;
printf("%d\n", ptr);
printf("%d\n", value);
  • 后缀递减运算符--的优先级高于间接访问运算符*,所以这个语句等价于*(ptr--)。
  • 执行逻辑:后缀--的特性是先返回指针当前的地址值,再将指针自身的地址减1;之后对返回的原地址进行解引用,但这个操作只是读取了value的值,并没有做任何修改。
  • 结果:指针ptr的地址被递减(对于int型指针,通常减少4字节,取决于平台的int大小),而value的值保持3不变。

关键总结

  • 如果想通过指针修改指向变量的值并减1,正确的写法是(*ptr)--(先解引用,再对变量递减)或者*ptr -= 1,这两个才是等价的。
  • *ptr--的作用是移动指针本身,而非修改指向的变量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 23:44:54