2013-07-26 51 views
2

我看到这种类型的代码了很多项目,我的工作:reinterpret_cast指针的含义是什么意思?

reinterpret_cast<long>(somePointer) 

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

感谢所有帮助

+0

看到这个 - http://stackoverflow.com/questions/310451/should-i-use-static-cast-or-reinterpret-cast-when-casting-a-void-to-whatever – 2013-07-26 12:12:05

+2

*“I在我工作的一个项目中,很多人都会看到这种类型的代码:“* - 某人的项目被破解并且充斥着黑客,更可能发生。 –

+0

这很糟糕。指针长度可能不够大。 –

回答

6

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

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

+0

是的,这正是他们所做的。谢谢! – user2381422

+1

@ user2381422如果存在迂腐的风险,指针的大小可能会比长整型大,在这种情况下,该值可能会被截断,从而导致关键冲突。 –

+0

它只会在读回时爆炸,因为如果它的一半已经消失,指针将会失效 – paulm

0

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

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

但由于C++认为指针和正常的整数值为截然不同的类型,你不能只是做一个正常的演员,你要问编译器重新诠释的指针作为long,这是什么reinterpret_cast呢。

0
reinterpret_cast<long>(somePointer) 

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

0

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

reinterpret_cast<new_type>(value)真的是“把‘位’的value和转换,以便它可以作为new_type” - 编译器会只是做你问的是什么,无论它使多大意义或不 - 因此,作为一名程序员,您应该确保只以真正有用的方式来执行此操作 - 如果您碰巧从64位指针中删除了32位,然后再尝试将其设置为指针如果指针“不好”之后就是你的错。 reinterpret_cast应该只能作为最后的手段,通常还有其他方法可以做同样的事情。

0

reinterpret_cast<x>(exp)

重新解释底层的比特模式,返回类型的值x

它指示编译器以治疗exp仿佛它有类型x

随着比特序列reinterpret_cast你可以投射一个指向不同类型的指针,然后reinterpret_cast它回到原始类型来获得原始值。

0

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

下面是the MSDN website使用它来实现一个基本的哈希函数的例子(注意,这里使用一个unsigned int,而不是一个长期的,但原理是一样的)

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

这需要一个任意指针,并为该指针生成(有效)唯一的散列值 - 将指针视为unsigned int,将积分值与其自身的位移版本异或,然后将结果截断为unsigned short

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

相关问题