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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 02:15:03