You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不通过指针强制转换访问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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 17:16:06