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

为何数组连续元素地址直接相减与存入变量后相减结果不同?

数组指针相减与整数相减的差异解析

先看修正后的代码(还原转义字符):

#include<stdio.h>

int main()
{
    int a[2] = {1,3};
    long a0 = &a[0];
    long a1 = &a[1];
    printf("%ld - %ld = %d\n\n", &a[1], &a[0], ((&a[1]) - (&a[0]))); // 输出1
    printf("%ld - %ld = %d\n\n", a1, a0, a1 - a0); // 输出4
    printf("size of a0 [%ld] is %d\n", a0, sizeof(a0)); // 输出某个地址和8
    return 0;
}

两个打印结果不同的核心原因是操作数类型不同,触发了完全不同的运算规则:

  • 直接用&a[1] - &a[0]时,这两个表达式的类型是int*(指向int的指针)。C语言规定,指向同一数组的指针相减,结果是两个指针之间的元素个数,而非字节数。因为你的系统中int占4字节,两个地址实际差4字节,除以int的大小4,结果就是1。
  • 把指针赋值给long类型变量后,a1 - a0是普通整数减法。这里指针地址被转换成了整数(64位系统下long是8字节,能容纳指针值),整数相减直接计算地址的字节差值,所以得到4。

额外补充两点注意事项:

  1. 指针相减的结果类型是ptrdiff_t,应该用%td格式符打印,而非%d,避免因类型不匹配导致潜在问题。
  2. 把指针强制转换成long并非标准安全做法,不同平台下指针大小可能和long不一致(比如某些平台long是4字节,指针是8字节,会导致地址截断)。更稳妥的方式是使用<stdint.h>中定义的uintptr_t或intptr_t类型存储指针的整数形式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 04:53:14