C语言中指针自增赋值与指针加1赋值的地址差异疑问
为什么
a++和a+1赋值给指针后结果不同? 这其实是因为**后置自增运算符++和普通指针加法+1**的行为逻辑完全不一样,咱们一步步理清楚:
1. 关于int* b = (a++);的情况
后置++的规则非常明确:先把变量当前的原始值作为整个表达式的结果返回,完成赋值后再对变量本身执行自增操作。
放在你的代码里就是:
- 当执行
b = a++时,程序会先把a当前指向的地址(也就是calloc返回的起始地址)直接赋值给b。 - 等赋值完成后,
a才会自己往后偏移一个int的字节数(比如4字节,取决于系统的int大小)。
所以赋值瞬间b拿到的是a没变动之前的地址,自然和最初的a指向同一个位置;而赋值结束后,a才变成指向后面的位置,但这时候b的值已经固定了。
2. 关于int* b = a + 1;的情况
这里的a + 1是纯粹的指针偏移计算:
- 程序会直接以
a当前的地址为基础,计算出往后偏移一个int大小的新地址,然后把这个新地址赋值给b。 - 整个过程中,
a本身的值完全不会被修改,它依然指向calloc返回的起始地址。
所以b从一开始就指向a后面一个int的位置,自然和a的地址不一样。
一句话总结
核心差异在于:
- 后置
++是先返回原值,再修改原变量 +1是直接计算偏移后的新地址,不修改原变量
内容的提问来源于stack exchange,提问作者Striker
相关产品推荐
相关产品推荐

