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*,表明我们只希望打印指针的地址,而不是其指向的内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值