如何将C语言中的int指针转换为void指针?
- 内容介绍
- 文章标签
- 相关推荐
本文共计793个文字,预计阅读时间需要4分钟。
整數轉換不是類型兼容轉換,不保證結果正確,使用 `static_cast` 需要謹慎。
-
int通常太小(32 位),在 64 位系统上无法安全存地址,强行转可能截断高位,运行时崩溃或静默出错 - 正确做法是先转成
uintptr_t(定义在<cstdint>),再用reinterpret_cast<void></void> - 反向转换(
void*→ 整数)也必须走uintptr_t,不能直接转int
示例:
uintptr_t addr_val = 0x123456789ABCDEF0ULL; void* p = reinterpret_cast<void*>(addr_val); // ✅ 安全
为什么 void* 不能直接接收 int 值
因为 void* 是对象指针类型,语义上代表“某个内存地址的起始位置”,而 int 是算术类型。C++ 类型系统严格区分这两类,编译器不会隐式做这种解释性转换——这不是精度问题,是语义越界。
本文共计793个文字,预计阅读时间需要4分钟。
整數轉換不是類型兼容轉換,不保證結果正確,使用 `static_cast` 需要謹慎。
-
int通常太小(32 位),在 64 位系统上无法安全存地址,强行转可能截断高位,运行时崩溃或静默出错 - 正确做法是先转成
uintptr_t(定义在<cstdint>),再用reinterpret_cast<void></void> - 反向转换(
void*→ 整数)也必须走uintptr_t,不能直接转int
示例:
uintptr_t addr_val = 0x123456789ABCDEF0ULL; void* p = reinterpret_cast<void*>(addr_val); // ✅ 安全
为什么 void* 不能直接接收 int 值
因为 void* 是对象指针类型,语义上代表“某个内存地址的起始位置”,而 int 是算术类型。C++ 类型系统严格区分这两类,编译器不会隐式做这种解释性转换——这不是精度问题,是语义越界。

