如何不通过指针强制转换访问long变量存储的地址指向的内容?
问题解答
首先明确:没有办法绕过强制类型转换直接用long类型的q访问对应地址的内容,核心原因和相关规范说明如下:
强类型系统的约束
C++是强类型语言,long属于整数类型,仅会被编译器当作普通数值处理;而指针类型不仅包含地址数值,还附带了内存解析的类型信息(比如int*会告诉编译器按4字节整数格式解析对应内存)。两者语义完全不同,必须通过强制转换明确告知编译器“将这个整数视为指定类型的指针”,才能正确访问目标内存。更规范的地址存储方案
用long存储指针值并不跨平台,因为long的长度在32位系统是4字节、64位系统是8字节,而指针长度严格匹配平台位数。C++标准专门提供了用于存储指针的整数类型:std::intptr_t:可安全存储指针值的有符号整数类型std::uintptr_t:无符号版本
它们定义在<cstdint>头文件中,替换long能让代码更具可移植性。
修改后的示例代码:
#include<iostream> #include<cstdint> using namespace std; int main() { int x = 9; int *p = &x; std::intptr_t q = reinterpret_cast<std::intptr_t>(&x); cout << p << endl; cout << std::hex << q << endl; // 访问内容仍需转换为指针类型 cout << *reinterpret_cast<int*>(q) << endl; }
- 关于类型转换的补充
C++中推荐用reinterpret_cast完成指针与整数的转换,相比C风格的强制转换,它的语义更清晰,明确表达了“重新解释内存二进制表示”的意图。
总结:无论用哪种整数类型存储指针值,要访问对应内存内容,都必须将其转换回指针类型,这是C++类型系统的硬性要求,没有跳过转换的方法。
内容的提问来源于stack exchange,提问作者Raftel
相关产品推荐
相关产品推荐

