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

为何两个int指针相减结果为1而非sizeof(int)?

指针相减结果疑问
void main() {
    int a = 2;
    int *p = &a;
    int *q = p++;
    printf("%d %d\n", p, q);
    int b = p - q;
    printf("%d", b);
}

运行这段代码后,指针p与q相减的输出结果为1。我原本认为应该输出int的大小,因为两者的距离是1 * sizeof(int),尝试其他指针也未得到预期结果,想询问这一现象的原因。


原因解析

  • C语言规定,同类型指针相减的结果是两个指针之间相隔的元素个数,不是字节数。这个设计是为了和数组操作逻辑统一:比如访问数组第n个元素时用arr[n],本质是*(arr + n),这里的+n就是移动n个元素的位置,指针相减自然也以元素为单位计算。
  • 你的代码中,p和q都是int*类型,p++让p指向了变量a之后的下一个int元素位置(即便该位置不属于有效变量,指针运算依然遵循规则),所以p - q得到1,代表两者相差1个int元素。
  • 如果需要获取字节层面的距离,可以把指针强制转换为char*类型后再相减——因为char*的运算单位是1字节:
int b = (char*)p - (char*)q;

此时输出结果就是sizeof(int)的值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 11:00:42