为何数组连续元素地址直接相减与存入变量后相减结果不同?
数组指针相减与整数相减的差异解析
先看修正后的代码(还原转义字符):
#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。
额外补充两点注意事项:
- 指针相减的结果类型是
ptrdiff_t,应该用%td格式符打印,而非%d,避免因类型不匹配导致潜在问题。 - 把指针强制转换成
long并非标准安全做法,不同平台下指针大小可能和long不一致(比如某些平台long是4字节,指针是8字节,会导致地址截断)。更稳妥的方式是使用<stdint.h>中定义的uintptr_t或intptr_t类型存储指针的整数形式。
内容的提问来源于stack exchange,提问作者Zafar
相关产品推荐
相关产品推荐

