reinterpret_cast如何工作?

0xb*_*00d 2 c++ byte binaryfiles reinterpret-cast

我想知道reinterpret_cast是如何在幕后工作的.我正在从一本书中学到它,但我只是不明白.例如,假设我有以下部分代码:

int a = 255;
char *pChar = reinterpret_cast<char*>(&a);
Run Code Online (Sandbox Code Playgroud)

要么

std::string str = "Hello";
char *pChar = reinterpret_cast<char*>(&str);
Run Code Online (Sandbox Code Playgroud)

pChar在两个例子中都指出了什么,当我试图打印他们的内容时我为什么看不到任何东西,当然reinterpret_cast如何工作?

编辑: 我知道reinterpret_cast使用非常危险,只想用它将字节直接写入内存块的二进制文件中.我不明白的是,当我有一个

int a = 255; (00 00 00 FF in memory)
Run Code Online (Sandbox Code Playgroud)

我想将变量a视为一系列字节,char*:

char *pChar = reinterpret_cast<char*>(&a);
Run Code Online (Sandbox Code Playgroud)

pChar会指向变量的各个字节a(00 00 00 FF)吗?

所以当我想写入二进制文件时pChar指向的是什么:

a_file.write(reinterpret_cast<char*>(&a), sizeof(a));
Run Code Online (Sandbox Code Playgroud)

它写出变量的各个字节a,对吧?

mid*_*dor 6

它在运行时没有做任何事情.Cpp参考:

与static_cast不同,但与const_cast类似,reinterpret_cast表达式不会编译为任何CPU指令.它纯粹是一个编译器指令,它指示编译器将表达式的位序列(对象表示)视为具有new_type类型.

你的转换都非常危险,因为第一个指针指向一个int,它可能会00 00 00 FF在内存中表示,因此不会打印任何东西,因为00 =='\ 0',这是字符串结尾的char.这假设您使用的是大端机器.如果这是一个int用非零值填充所有字节的,那么您将无限期地读取该位置的末尾.

第二个告诉编译器将位于的位置string视为char*实际字符串内容的起始地址,而不是实现定义的结构,它包含大小,容量和指针变量或字符串的表示形式.小串优化.由于大小和容量通常为64位宽,并且大小和容量可能都小于2 ^ 32,因此您可能会遇到零字节,因此不会打印任何内容.再一次,如果没有意外的零字节,你的读取将无限期地结束.

解决OP的编辑问题:

根据链接的cpp-reference网站的第5节

任何指向T1类型对象的指针都可以转换为指向另一种类型cv T2的对象的指针.这完全等同于static_cast(static_cast(expression))(这意味着如果T2的对齐要求不比T1更严格,则指针的值不会改变,并且将结果指针转换回其原始类型会产生原始值) .在任何情况下,如果类型别名规则允许,则只能安全地取消引用结果指针(见下文)

赋予以下内容:

当动态类型为DynamicType的对象的指针或引用是reinterpret_cast(或C样式转换)为指针或对不同类型AliasedType的对象的引用时,转换总是成功,但结果指针或引用可能仅用于如果满足以下条件之一,则访问该对象:...

AliasedType是char,unsigned char或std :: byte:这允许将任何对象的对象表示检查为字节数组....

,指针应指向a启动的地址.