我有以下代码
#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
答案 0 :(得分:4)
reinterpret_cast
会导致您投射的数据被视为不同类型,而不会执行任何转换。根据标准,reinterpret_cast
之后唯一定义的行为是将reinterpret_cast
恢复为原始类型。
这听起来有点无用,但您可能想要使用它的一个原因是,例如,在C ++中使用某些C库(例如pthreads)。许多涉及回调的C库将类型为void*
的参数传递给回调。在C ++中,处理这个问题的正确方法是在将它传递给C库时,将指针指向要用作参数的任何指针reinterpret_cast
到void*
,然后{{1它回到了回调中的实际内容。
虽然标准没有保证定义行为,但在大多数平台/编译器上,reinterpret_cast
所做的只是将数据视为不同的类型,使用相同的位模式。例如,如果您的位模式恰好是reinterpret_cast
的32位双d
,并且您编写01101010 00111100 01101010 01000001
,那么int i = reinterpret_cast<int>(d)
将是一个整数,其位模式i
,即使它表示一个完全不同的数值作为整数而不是双精度数。显然,如果涉及的类型不同,这会让你很快陷入困境。
答案 1 :(得分:2)
请参阅here。
到底有什么不清楚?请具体说明。在你问之前也要搜索,关于这个问题有很多问题。
答案 2 :(得分:1)
reinterpret_cast<>
此处将转换而不检查p
指向int
的指针,但您无法假设此int
代表什么。你唯一能做的就是将这个指针转换回原来的状态。
在更实际的说明中,您的编译器可能会将地址p
指向int
值,但int
大小可能与系统指针大小不匹配,所以你应该使用类似uintptr_t
的内容而不是int
。
您可以使用类似Boost lexical_cast<>
的内容,它会尝试将整数的字符串表示形式转换为实际的整数值,但我不确定这是您的目标。
答案 3 :(得分:1)
没有太多要解释的。 reinterpret_cast
的结果是特定于平台的。您测试输出的内容可能是字符串常量的地址,也可能是强制转换为int
时的剩余字符串。