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

指针相减结果为何与指向的值无关?附C语言代码疑问

为什么C语言中指针相减的结果和指向的值无关?

先看你给出的代码:

#include <stdio.h>

void main() {

    int arr[] = {10,20,30,40};
    int *p1 = arr;
    int *p2 = &arr[2];

    printf("%d",p2-p1);
}

输出结果是2,核心原因是C语言的指针算术规则:

  • 当两个指向同一数组的同类型指针相减时,计算的不是内存地址的字节差值,而是它们之间相隔的数组元素个数。
  • 这个计算会自动除以指针指向类型的字节长度,逻辑上等价于:指针差值 = (地址字节差) / sizeof(指针指向的类型)

拿你的例子具体拆解:

  • arr是int类型数组,假设每个int占4字节(不同系统可能有差异,但不影响结果逻辑)
  • p1指向arr[0],假设它的内存地址是0x100;p2指向arr[2],对应的地址就是0x100 + 2*4 = 0x108
  • 地址的字节差是0x108 - 0x100 = 8,除以sizeof(int)(4)后,结果就是2,这就是你看到的输出。

至于为什么和指向的值无关?因为指针存储的是内存地址,指针算术只关心地址对应的数组位置,和地址里存的具体数值没有任何关系——哪怕你把arr[0]改成1000,arr[2]改成9999,只要p1指向第0个元素,p2指向第2个,差值依然是2。

注意:只有指向同一数组(或者数组末尾的下一个合法位置)的同类型指针相减才是C标准允许的行为,否则属于未定义行为,结果不可预测。

内容的提问来源于stack exchange,提问作者Thushar D.M.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 05:17:08