重新解释一个指针的意义是什么意思?

时间:2013-07-26 12:10:32

标签: c++

我在我正在处理的项目中经常看到这种类型的代码:

reinterpret_cast<long>(somePointer)

我不明白这一点。它通常用于用户定义的类, 也就是说,somePointer是指向用户定义类的实例的指针。

感谢您的帮助

6 个答案:

答案 0 :(得分:6)

它用于将指针的地址转换为其数字表示形式,并将其存储为long

当您需要将指针存储在不支持实际指针的特定上下文中时,通常会使用它。例如,某些API允许您传递一个数字键,它们会在该API的任何回调中返回给您。您可以创建一个对象并将其强制转换为数字并将其提供给API。然后在回调中,您将数字强制转换为带有pointer=reinterpret_cast<type*>(number)的指针,然后访问您的数据。

答案 1 :(得分:0)

指针实际上只是一个整数值,只是编译器将其解释为内存地址。

这意味着您可以将其存储在其他整数类型中,如果其他整数类型足够大以容纳地址(例如,您不能将16位地址存储在16位整数变量中)

但是由于C ++将指针和普通整数值视为不同的类型和不同的类型,你不能只进行正常的转换,你必须要求编译器将指针重新解释为 {{1 },这是long所做的。

答案 2 :(得分:0)

reinterpret_cast<long>(somePointer)

这段代码将somePointer的地址转换为long,最好在C ++中使用intptr_tuintptr_t作为有符号/无符号整数类型11在此。它们能够保存从void指针转换的值,然后转换回该类型,其值与原始指针的值相等。

答案 3 :(得分:0)

正如其他人所说的那样,将指针转换为整数值。这有点“危险”,因为指针实际上可能不适合longcstdint中有一个名为intptr_t的类型,用于此目的。

reinterpret_cast<new_type>(value)实际上是“取value的'位'并转换它以便它可以用作new_type” - 编译器就会按照你的要求执行它是否有意义 - 所以这取决于你作为一个程序员,以确保你只是以一种实际做一些有用的方式做到这一点 - 如果你碰巧从64位指针切割32位,然后尝试再次将它变成一个指针,如果指针“之后没有任何好处”,那就是你的错。 reinterpret_cast实际上只应作为最后的手段使用,通常还有其他方法可以做同样的事情。

答案 4 :(得分:0)

reinterpret_cast<x>(exp)

重新解释基础位模式,返回类型x

的值

它指示编译器将exp的位序列视为类型x

使用reinterpret_cast,您可以将指针转换为其他类型,然后reinterpret_cast将其返回原始类型以获取原始值。

答案 5 :(得分:0)

就像Sean所说的那样,对于操纵指针就好像它们是数字一样有用。

这是the MSDN website中使用它来实现基本哈希函数的示例(请注意,这使用了unsigned int而不是long,但原理是相同的)

unsigned short Hash( void *p ) {
   unsigned int val = reinterpret_cast<unsigned int>( p );
   return ( unsigned short )( val ^ (val >> 16));
}

这需要一个任意指针,并为该指针生成(有效)唯一哈希值 - 将指针视为unsigned int,使用自身的位移版本对整数值进行异或,然后截断将结果转换为unsigned short

然而,就像其他人一样,这是非常危险的,应该避免。