为何两个int指针相减结果为1而非sizeof(int)?
指针相减结果疑问
void main() { int a = 2; int *p = &a; int *q = p++; printf("%d %d\n", p, q); int b = p - q; printf("%d", b); }
运行这段代码后,指针p与q相减的输出结果为1。我原本认为应该输出int的大小,因为两者的距离是1 * sizeof(int),尝试其他指针也未得到预期结果,想询问这一现象的原因。
原因解析
- C语言规定,同类型指针相减的结果是两个指针之间相隔的元素个数,不是字节数。这个设计是为了和数组操作逻辑统一:比如访问数组第n个元素时用
arr[n],本质是*(arr + n),这里的+n就是移动n个元素的位置,指针相减自然也以元素为单位计算。 - 你的代码中,
p和q都是int*类型,p++让p指向了变量a之后的下一个int元素位置(即便该位置不属于有效变量,指针运算依然遵循规则),所以p - q得到1,代表两者相差1个int元素。 - 如果需要获取字节层面的距离,可以把指针强制转换为
char*类型后再相减——因为char*的运算单位是1字节:
int b = (char*)p - (char*)q;
此时输出结果就是sizeof(int)的值。
内容的提问来源于stack exchange,提问作者ezra123
相关产品推荐
相关产品推荐

