为何C++中指针的前置递增有效,而后置递增无效?
指针前置/后置递增为啥结果不一样?
你的问题
我写了一段C++代码,想通过二级指针dblptr修改一级指针tempptr的地址,本来以为不管用前置递增++*(dblptr)还是后置递增*(dblptr)++,执行完后tempptr和*(dblptr)的输出应该一致,但实际测试只有前置递增符合预期。明明普通int变量里,不管前置后置,变量最终都会自增,为啥指针操作就有差异?
指针测试代码
int main(){ int temp=10; int * tempptr= &temp; int ** dblptr= &tempptr; cout<<tempptr<<endl; cout<<*(dblptr)<<endl; ++ *(dblptr); // 前置递增,符合预期 // *(dblptr) ++; // 后置递增,不符合预期 cout<<tempptr<<endl; cout<<*(dblptr)<<endl; return 0; }
普通int变量对比示例
int a=2; int j; j=a++; // j为2,a最终变成3 j=++a; // j为3,a最终变成3
核心原因:运算符优先级搞的鬼
问题本质是C++运算符的优先级和结合性规则,和指针本身没关系:
后置
++的优先级比*高
当你写*(dblptr)++时,编译器会先处理dblptr++——也就是让二级指针dblptr自己的地址往后跳一个int*的长度,根本没碰它指向的tempptr。后面的*只是解引用这个已经跑偏的二级指针(这时候访问的是tempptr变量后面的内存,属于非法操作,但这里没用到这个值)。
结果就是tempptr完全没被修改,而dblptr已经指向了错误的位置,最后两者输出自然不一样。前置
++和*优先级相同,结合性从右到左
写++*(dblptr)时,编译器会先解析*(dblptr)拿到tempptr,再对tempptr做前置递增——也就是修改tempptr的地址值。这时候dblptr还是好好指着tempptr,所以最后两者输出一致。
为啥int变量没这问题?
普通int的a++和++a里,没有其他优先级更高的运算符干扰,不管前置后置,都是直接对a本身做自增操作,所以最终a都会变成自增后的值。
内容的提问来源于stack exchange,提问作者shubham kakade
相关产品推荐
相关产品推荐

