我有以下代码
#include <iostream>
using namespace std;
int main(){
int i;
char *p="this is a string";
i=reinterpret_cast<int>(p);
cout<<i<<"\n":
return 0;
}
输出为:7648 请解释 reinterpret_cast
我有以下代码
#include <iostream>
using namespace std;
int main(){
int i;
char *p="this is a string";
i=reinterpret_cast<int>(p);
cout<<i<<"\n":
return 0;
}
输出为:7648 请解释 reinterpret_cast
reinterpret_cast
导致您要转换的数据被视为不同的类型,而不执行任何转换。根据标准,在 a 之后定义的唯一行为reinterpret_cast
是将reinterpret_cast
其恢复为原始类型。
这听起来有点没用,但您可能想要使用它的一个原因是,例如,在 C++ 中使用某些 C 库(例如 pthread)。许多涉及回调的 C 库将类型参数传递void*
给回调。在 C++ 中,处理此问题的正确方法是获取一个指向您想要用作参数的任何内容的指针,将reinterpret_cast
其void*
传递给 C 库时,然后reinterpret_cast
将其返回到回调中实际存在的任何内容。
虽然标准不保证定义行为,但在大多数平台/编译器上,areinterpret_cast
所做的只是使用相同的位模式将数据视为不同的类型。例如,如果您有一个 32 位双d
精度,其位模式恰好是01101010 00111100 01101010 01000001
,并且您编写int i = reinterpret_cast<int>(d)
,那么i
将是一个位模式为 的整数01101010 00111100 01101010 01000001
,即使这将表示作为整数的数值与作为双精度完全不同的数值. 显然,如果所涉及的类型大小不同,这会让您很快陷入困境。
见这里。
究竟是什么不清楚?请具体。在你问之前也搜索一下,关于这个有很多关于这个的问题。
reinterpret_cast<>
这里将在不检查p
指向 an的指针的情况下进行转换,int
但您不能做出任何假设这int
将代表什么。您唯一能做的就是将此指针转换回原来的样子。
在更实际的说明中,您的编译器可能会将地址p
指向的值放入int
值中,但int
大小可能与系统指针大小不匹配,因此您可能应该使用类似uintptr_t
的东西而不是int
.
您可以使用Boostlexical_cast<>
之类的东西,它会尝试将整数的字符串表示形式转换为真正的整数值,但我不确定这是您的目标。
没什么好解释的。结果reinterpret_cast
是特定于平台的。您要测试的输出可能是字符串常量的地址,或者当它被强制转换为int
.