关于reinterpret_cast的问题

时间:2010-07-29 14:52:07

标签: c++ 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

4 个答案:

答案 0 :(得分:4)

reinterpret_cast会导致您投射的数据被视为不同类型,而不会执行任何转换。根据标准,reinterpret_cast之后唯一定义的行为是将reinterpret_cast恢复为原始类型。

这听起来有点无用,但您可能想要使用它的一个原因是,例如,在C ++中使用某些C库(例如pthreads)。许多涉及回调的C库将类型为void*的参数传递给回调。在C ++中,处理这个问题的正确方法是在将它传递给C库时,将指针指向要用作参数的任何指针reinterpret_castvoid*,然后{{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时的剩余字符串。