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

指针减法结果不符疑问:为何ptr2-ptr未得到预期值4?

指针减法结果不符合预期?搞懂C语言指针运算规则就通了

先把你大概率的完整代码补上(你贴的代码截断了),应该是类似这样的:

#include <stdio.h>

int main() {
    int arr[] = {0, 2};
    int *ptr = arr;
    int *ptr2 = &arr[1];
    
    printf("%ld\n", ptr2 - ptr); // 实际输出1
    printf("%d\n", *ptr2);      // 实际输出2
    return 0;
}

你的疑惑特别典型——很多刚摸指针的同学都会踩这个坑。你以为指针减法是直接算两个地址的字节差,但C语言里同类型指针相减,结果是两个指针之间相隔的「元素个数」,而非字节数!

给你拆解得明明白白:

  • 假设你的系统里int占4字节(绝大多数现代系统都是),那ptr指向的地址比如是0x1000,ptr2指向的就是0x1004,地址的字节差确实是4。
  • 但因为ptr和ptr2都是int*类型,C语言会自动把地址差除以sizeof(int)(也就是4),最终结果就是4/4=1——这就是你看到输出1的原因。

如果想得到你预期的字节差,得把指针转换成char*类型再做减法,因为char的大小固定是1字节,不会有自动换算:

printf("%ld\n", (char*)ptr2 - (char*)ptr); // 这时候就会输出4

为什么C语言要这么设计?其实是为了数组操作更顺手。比如我们写arr[1],本质等价于*(arr + 1)——这里的+1是让指针移动1个int元素的位置(也就是4字节),而非1字节。指针减法的规则和加法统一,都是以「元素」为单位,而非字节。

所以你的错误核心就是:把指针减法的运算单位当成了字节,而实际上它的单位是指针指向数据类型的元素个数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:30:43