不能直接用 static_cast 把 int 转成指针,因为 C++ 类型系统禁止整数与指针间的跨域转换;必须用 reinterpret_cast 或 C 风格强制转换,并确保使用 uintptr_t 存储地址以保证平台兼容性。

为什么不能直接用 static_cast 把 int 转成指针?
因为 C++ 类型系统明确禁止这种转换:static_cast<int>(42)</int> 会编译失败。整数和指针是不同类别类型,static_cast 只允许相关类型间转换(如继承关系、数值类型互转),不支持跨域“值 → 地址”映射。
正确做法:用 reinterpret_cast 或 C 风格强制转换
这是唯一标准且可移植的方式,前提是你要清楚自己在做什么——你不是在“转换数值”,而是在把一个整数**解释为内存地址**。
-
reinterpret_cast<int>(0x12345678)</int>是合法的,结果是一个指向地址0x12345678的int* - C 风格写法
(int*)0x12345678效果相同,但更难被审查,不推荐 - 目标类型必须与平台指针宽度匹配:32 位系统上用
uint32_t,64 位系统上必须用uintptr_t或uint64_t持有地址值,否则截断会导致地址错误
常见误用场景和崩溃风险
最常出问题的地方不是语法,而是语义误判:
- 把任意小整数(比如
1、100)转成指针后解引用 —— 这几乎必然触发segmentation fault或访问违规 - 从
void*转回来时用了错误的类型:比如原先是char*,却用reinterpret_cast<int>(ptr)</int>再转,导致读取越界或对齐错误 - 跨平台代码里硬写
long存地址:Windows 上long是 32 位,Linux x86_64 上是 64 位,不可靠;必须用uintptr_t
实际可用的最小安全模式
如果你真需要整数 ↔ 指针来回转换(例如驱动开发、嵌入式寄存器映射、某些序列化场景),只做这两件事:
立即学习“C++免费学习笔记(深入)”;
- 存储时:用
uintptr_t addr = reinterpret_cast<uintptr_t>(ptr);</uintptr_t> - 还原时:用
int* p = reinterpret_cast<int>(addr);</int> - 永远检查地址是否对齐(比如
addr % alignof(int) == 0),尤其在 ARM 或 RISC-V 上未对齐访问会直接 trap
没有运行时验证,也没有“安全 wrapper”——这类转换本身就是底层契约,错一点就崩,别指望编译器帮你兜底。


















