指针减法结果不符疑问:为何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
相关产品推荐
相关产品推荐

