指针相减结果为何与指向的值无关?附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.
相关产品推荐
相关产品推荐

