为何指针操作中自减运算符(--)与减等运算符(-=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
相关产品推荐
相关产品推荐

