C/C++中将地址转换为指针并读取对应值的正确方法是什么?
错误原因
你代码的核心问题是参数类型定义错误:double &addr是double类型变量的左值引用,不是内存地址类型,自然无法直接强转为指针或者赋值给指针变量。
从给定地址读取值的正确方式
内存地址本质是匹配系统指针长度的整数,操作逻辑为:先将地址值转换为对应数据类型的指针,再通过解引用运算符*读取值。注意该操作仅在你明确知道目标地址合法、可访问、且确实存储了对应类型的数据时才可使用,否则会触发未定义行为。
代码示例
修正后的可运行代码(C++版)
#include <iostream> #include <cstdint> // 定义了uintptr_t,是和指针长度匹配的无符号整数类型 // 写法1:传入整数格式的地址值 void getDouble(uintptr_t addr) { // 先将地址整数强转为double类型指针 double* dbl_ptr = reinterpret_cast<double*>(addr); // 解引用读取对应值 std::cout << *dbl_ptr << std::endl; // 输出地址本身 std::cout << dbl_ptr << std::endl; } // 写法2:直接传入指针类型,是C/C++更推荐的常规写法 void getDouble(double* dbl_ptr) { std::cout << *dbl_ptr << std::endl; std::cout << dbl_ptr << std::endl; } int main() { double test_val = 3.14159; // 调用写法1:取变量地址转成uintptr_t后传入 getDouble(reinterpret_cast<uintptr_t>(&test_val)); // 调用写法2:直接传入变量地址 getDouble(&test_val); return 0; }
C语言版写法
C语言没有reinterpret_cast,直接用C风格强转即可:
#include <stdio.h> #include <stdint.h> void getDouble(uintptr_t addr) { double* dbl_ptr = (double*)addr; printf("%f\n", *dbl_ptr); printf("%p\n", dbl_ptr); } void getDouble2(double* dbl_ptr) { printf("%f\n", *dbl_ptr); printf("%p\n", dbl_ptr); } int main() { double test_val = 3.14159; getDouble((uintptr_t)&test_val); getDouble2(&test_val); return 0; }
注意事项
- 如果是操作硬编码的固定地址(比如嵌入式开发中操作寄存器),可直接写
*(double*)0xXXXXXXX(0xXXXXXXX为目标地址)。 - 不要随意对未知地址做解引用操作,绝大多数场景下直接操作原始地址都是不安全的,会触发段错误或者不可预期的程序异常。
内容的提问来源于stack exchange,提问作者richbai90
相关产品推荐
相关产品推荐

