C++整数指针相减结果不符预期,求解析结果为12的原因
为什么C++里整数指针相减得到12,而非预期的48或3?
嘿,我完全懂你这会儿的困惑——明明看着地址差或者元素下标/值差应该是48或者3,结果指针相减出来个12,这事儿确实容易踩坑。其实这是C++指针算术的核心规则在起作用,咱们掰碎了说:
核心规则:同类型指针相减,结果是「元素个数差」,不是字节差
C++里设计指针算术的初衷就是方便数组操作,所以当两个指向同类型的指针相减时,编译器会自动帮你把「内存地址的字节差值」除以「该类型的大小」,最终得到的是这两个指针之间隔了多少个该类型的元素。
举个贴合你场景的例子,假设你代码大概是这样:
#include <iostream> using namespace std; int main() { int arr[100]; int* p1 = &arr[2]; // 指向数组下标为2的元素 int* p2 = &arr[14]; // 指向数组下标为14的元素 cout << "指针相减结果:" << p2 - p1 << endl; // 输出12 return 0; }
在多数系统上sizeof(int)是4字节,那p2和p1的内存地址差其实是12 * 4 = 48字节,但指针相减时会自动除以4,所以得到12——这就是你看到的结果。
为什么你的预期不对?咱们逐个说
- 如果你想得到字节层面的差值48:那得把指针转换成
char*类型再减,因为char的大小是1字节,不会做除法转换。比如:cout << "字节差:" << (char*)p2 - (char*)p1 << endl; // 输出48 - 如果你想得到元素值的差(比如50-2=48):那得先解引用指针,拿到元素的值再相减,而不是直接减指针本身:
arr[2] = 2; arr[14] = 50; cout << "元素值差:" << *p2 - *p1 << endl; // 输出48 - 至于你说的
5-2=3:这应该是你误以为指针指向的下标差是3?比如如果p1指向arr[2],p2指向arr[5],那指针相减才会得到3,但显然你的场景里两个指针的下标差是12,所以结果是12。
最后再划个重点
- 只有同类型且指向同一数组(或同一内存块)的指针相减才有意义,否则行为是未定义的。
- 指针算术的设计就是为了让数组操作更直观——比如指针
++会自动移动到下一个元素,不用手动算字节数,这在遍历数组时特别方便。
内容的提问来源于stack exchange,提问作者rakesh
相关产品推荐
相关产品推荐

