我在我从事的一个项目中经常看到这种类型的代码:
reinterpret_cast<long>(somePointer)
我不明白这一点。它通常用于用户定义的类,即 somePointer 是指向用户定义类的实例的指针。
谢谢你的帮助
我在我从事的一个项目中经常看到这种类型的代码:
reinterpret_cast<long>(somePointer)
我不明白这一点。它通常用于用户定义的类,即 somePointer 是指向用户定义类的实例的指针。
谢谢你的帮助
它用于将指针的地址转换为其数字表示形式并将其存储为long
.
当您需要将指针存储在不支持实际指针的特定上下文中时,通常会使用它。例如,某些 API 允许您传递一个数字键,它们会在该 API 的任何回调中返回给您。您可以创建一个对象并将其转换为一个数字并将其提供给 API。然后在回调中,您将数字转换回指针,pointer=reinterpret_cast<type*>(number)
然后访问您的数据。
指针实际上只不过是一个整数值,只是编译器将其解释为内存地址。
这意味着您可以将它存储在其他整数类型中,如果该其他整数类型足够大以保存地址(例如,您不能将 64 位地址存储在 16 位整数变量中)。
但是由于 C++ 将指针和普通整数值视为不同且不同的类型,因此您不能只进行普通强制转换,您必须要求编译器将指针重新解释为 a long
,这就是这样reinterpret_cast
做的。
reinterpret_cast<x>(exp)
重新解释底层位模式,返回一个类型的值x
它指示编译器将 a 的位序列exp
视为具有类型x
您可以将reinterpret_cast
指针转换为不同的类型,然后将reinterpret_cast
其返回到原始类型以获取原始值。
就像 Sean 所说的,它对于像操作数字一样操作指针很有用。
这是MSDN 网站上的一个例子,它使用它来实现一个基本的哈希函数(注意这里使用的是 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
.
然而,就像其他人所说的那样,这是非常危险的,应该避免。
正如其他人所说,将指针转换为整数值。这有点“危险”,因为指针实际上可能不适合long
. 有一种类型cstdint
叫做intptr_t
,它就是为此目的而设计的。
reinterpret_cast<new_type>(value)
真的是“取'位'并value
转换它,以便它可以用作new_type
” - 编译器只会按照你的要求做,无论它是否有意义 - 所以这取决于你作为程序员确保你只以一种真正有用的方式来做这件事——如果你碰巧从一个 64 位指针中剪切了 32 位,然后稍后再尝试将它变成一个指针,那么这是你的错,如果之后的指针“没有任何好处”。reinterpret_cast
真的应该只作为最后的手段使用,通常还有其他方法可以做同样的事情。
reinterpret_cast<long>(somePointer)
这段代码将持有的地址转换somePointer
为 a long
,最好在 this 中使用intptr_t
oruintptr_t
用于 C++11 中的有符号/无符号整数类型。它们能够保存从 void 指针转换的值,然后转换回具有与原始指针比较相等的值的类型。