指针大小由CPU地址总线宽度决定:32位系统为4字节,64位系统为8字节;同一平台下所有指针类型(int、char、函数指针等)大小均相同,C++仅如实反映硬件寻址能力。

指针大小由地址总线宽度决定,不是由语言或编译器“规定”的——32 位系统用 4 字节地址寻址,64 位系统用 8 字节地址寻址,C++ 只是如实反映这一硬件事实。
指针大小取决于地址空间,不是数据类型
无论 int*、char* 还是 void(*)()(函数指针),在同一个平台上大小完全一致。这是因为指针只存地址,而地址长度由 CPU 的寻址能力决定:
- 32 位系统地址总线宽 32 位 → 最多表达
2^32个不同地址 → 地址需要用 32 位(即 4 字节)表示 - 64 位系统地址总线宽 64 位 → 最多表达
2^64个地址 → 地址需 64 位(即 8 字节) -
sizeof(int*)和sizeof(char*)在 x86 下都是4,在 x64 下都是8,验证很简单:std::cout << sizeof(int*) << " " << sizeof(char*);
为什么 long 在 Linux 和 Windows 64 位下不一样,但指针一定一样?
long 是 ABI(应用二进制接口)约定的产物,而指针大小直接绑定地址宽度,不可妥协:
- Linux x64 使用 LP64 模型:
long和指针都是 8 字节 - Windows x64 使用 LLP64 模型:
long仍是 4 字节,但void*、size_t、所有指针类型强制为 8 字节 - 只要目标平台是 64 位,
sizeof(void*)必为8;32 位平台必为4—— 这是链接器和运行时加载器能正确解析地址的前提
跨平台代码里最容易踩的坑:把指针当 int 或 long 存
把地址强制转成 int 或未加修饰的 long,在 64 位系统上会截断高 32 位,导致崩溃或静默错误:
立即学习“C++免费学习笔记(深入)”;
- 错:
int addr = (int)ptr; // x64 下丢掉一半地址
- 对:
intptr_t addr = reinterpret_cast<intptr_t>(ptr); // 保证和指针同宽
- 更安全:
uintptr_t(无符号)用于地址算术,intptr_t(有符号)用于差值计算 - 别依赖
sizeof(long)判断平台位数 —— Windows x64 下sizeof(long)是4,但sizeof(void*)是8
真正要警惕的不是“指针为什么变大”,而是“哪些地方隐式假设了指针可塞进 int 或 long”——这类假设在迁移到 64 位时几乎必然出问题,且很难通过静态检查发现。


















