当前位置: 首页 > article >正文

char* 指针转换与打印

1.介绍

    uint32_t a= 5;
    char* b= (char*)&a;
    // 打印的是b变量所存储的uint32变量的起始地址
    cout << "Value of b (address of a): " << (void*)b << endl; 

    cout << "Address of b: " << &b << endl;// 打印的是b变量本身的内存地址
    cout<< b<<endl;// 这种用法是错误的

指针类型可以互相转换。b 是一个 char* 类型的指针,指向 a 的起始地址。

为什么直接打印b是错误的?主要与 指针解释和 cout 的行为 相关。

  • std::coutchar* 类型有特殊处理:
    • 它假定 b 指向的是以 \0 结尾的 C 风格字符串。
    • std::cout 会尝试读取 b 所指向的内存并将其解释为字符序列,直到遇到 \0
  • 如果 b 指向的数据不是有效的字符串(如整数的二进制表示),结果是未定义行为(可能输出乱码,也可能程序崩溃)。

假设 a = 5(在内存中为 0x05 0x00 0x00 0x00 小端序存储),直接打印 b 会尝试解释这段内存的内容,可能输出不可读的字符或乱码。

为什么要转换为void*

原因:
  • 避免解释为字符串:b 转换为 void* 后,std::cout 不再尝试将其解释为字符串,而是按照普通指针地址格式(如十六进制地址)进行打印。
  • 意图明确: 通过强制转换为 void*,表明我们只希望打印指针的地址,而不是其指向的内容。

http://www.kler.cn/a/397625.html

相关文章:

  • PostgreSQL物化视图详解
  • 重置docker版本的octoprint管理员账号密码
  • GPIO相关的寄存器(重要)
  • Spring:bean的配置
  • 当微软windows的记事本被AI加持
  • 大学语文教材电子版(第十一版)教学用书PDF及课件
  • 【MySQL】MySQL中的函数之JSON_REPLACE
  • Jmeter中的监听器(四)
  • 电动机三角型与星型的区别和接线方法图解
  • 新手小白学习docker第七弹------安装redis集群大厂面试
  • 从H3C和Dell官网下载OEM版VMware Esxi镜像攻略
  • 大数据技术之HBase中的HRegion
  • UAV-VisLoc:中国11地大规模无人机视觉定位数据集
  • Vulnhub靶场 Billu_b0x 练习
  • LeetCode77:组合
  • python常见的后缀文件
  • 【高等数学学习记录】函数的求导法则
  • C++初阶——优先队列
  • 分布式微服务项目,同一个controller不同方法间的转发导致cookie丢失,报错null pointer异常
  • 122、java的LambdaQueryWapper的条件拼接实现数据sql中and (column1 =1 or column1 is null)
  • 向潜在安全信息和事件管理 SIEM 提供商提出的六个问题
  • 深入解析 Linux 文件权限
  • MFC 鼠标悬停在控件上,显示提示信息
  • TCP(下):三次握手四次挥手 动态控制
  • Docker compose部署Activemq
  • PostgreSQL物化视图详解