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::cout
对char*
类型有特殊处理:- 它假定
b
指向的是以\0
结尾的 C 风格字符串。 std::cout
会尝试读取b
所指向的内存并将其解释为字符序列,直到遇到\0
。
- 它假定
- 如果
b
指向的数据不是有效的字符串(如整数的二进制表示),结果是未定义行为(可能输出乱码,也可能程序崩溃)。
假设 a = 5
(在内存中为 0x05 0x00 0x00 0x00
小端序存储),直接打印 b
会尝试解释这段内存的内容,可能输出不可读的字符或乱码。
为什么要转换为void*?
原因:
- 避免解释为字符串: 将
b
转换为void*
后,std::cout
不再尝试将其解释为字符串,而是按照普通指针地址格式(如十六进制地址)进行打印。 - 意图明确: 通过强制转换为
void*
,表明我们只希望打印指针的地址,而不是其指向的内容。