Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 重新解释_投射指针的长度意味着什么?_C++ - Fatal编程技术网

C++ 重新解释_投射指针的长度意味着什么?

C++ 重新解释_投射指针的长度意味着什么?,c++,C++,我在从事的项目中经常看到这种类型的代码: reinterpret_cast<long>(somePointer) reinterpret\u cast(somePointer) 我不明白这是什么意思。它通常用于用户定义的类, 也就是说,somePointer是指向用户定义类的实例的指针 感谢您的帮助它用于将指针地址转换为其数字表示形式,并将其存储为long 当您需要在不支持实际指针的特定上下文中存储指针时,通常会使用它。例如,某些API允许您传递一个数字键,它们将在该API的任何

我在从事的项目中经常看到这种类型的代码:

reinterpret_cast<long>(somePointer)
reinterpret\u cast(somePointer)
我不明白这是什么意思。它通常用于用户定义的类, 也就是说,somePointer是指向用户定义类的实例的指针


感谢您的帮助

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


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

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

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

< C++ >由于C++把指针和普通整数值看作是不同的类型,所以不能只做一个普通的CAST,你必须要求编译器重新解释指针为<代码>长< /C> >,这就是<代码> RealTytCase。
reinterpret_cast<long>(somePointer)

这段代码将
somePointer
持有的地址强制转换为
long
,对于C++11中的有符号/无符号整数类型,最好使用
intptr\t
uintptr\t
。它们能够保存从空指针转换的值,然后使用与原始指针比较相等的值转换回该类型。

正如其他人所说,它是将指针转换为整数值。这有点“危险”,因为指针实际上可能不适合
长的
cstdint
中有一种类型称为
intptr\u t
,用于此目的

reinterpret\u cast(value)
实际上是一种“获取
值的‘位’,并将其转换为
新类型”
”——编译器将按照您的要求执行,不管它是否有意义——作为程序员,你要确保你只以一种真正有用的方式来做这件事——如果你碰巧从一个64位指针上切下了32位,然后试图稍后再把它变成一个指针,那么如果指针“不好”,那就是你的错<代码>重新解释(exp)
实际上只能作为最后手段使用,通常还有其他方法可以做同样的事情。

重新解释(exp)

重新解释底层位模式,返回类型为
x

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


使用
reinterpret\u cast
可以将指针强制转换为不同的类型,然后
reinterpret\u cast
将指针重新转换为原始类型以获得原始值。

就像肖恩所说的那样,将指针当作数字来处理非常有用

下面是一个使用它实现基本哈希函数的示例(请注意,它使用无符号int而不是long,但原理相同)

无符号短散列(void*p){
无符号int val=重新解释(p);
返回(未签名短)(val^(val>>16));
}
它接受一个任意指针,并为该指针生成一个(有效的)唯一散列值-将指针视为一个
无符号int
,用自身的位移位版本对整数值进行异或运算,然后将结果截断为一个
无符号short


然而,正如其他人所说,这是非常危险的,应该避免。

看到这个--“我在我从事的一个项目中经常看到这种类型的代码:”--有人的项目被破坏了,很可能充满了黑客。这很糟糕。Long可能不够大,不适合指针。是的,这正是它们所做的。谢谢大家!@user2381422指针的大小可能会比长指针的大小大,在这种情况下,该值可能会被截断,从而导致键冲突。当读回指针时,指针会爆炸,因为如果指针的一半被截断,指针将无效gone@ComeRaczy:非常正确,事实上,如果您曾经为windows 64位或power 64位体系结构编译过该代码,它将以
sizeof(long)==4、sizeof(void*)==8的形式崩溃。这不仅仅是迂腐,它在当前代码中有实际影响。您需要在您的平台上进行验证,但它很可能会起作用:
$cat test_pointer_size.c#include int main(int argc,char*argv[]){printf(“sizeof(long):%u sizeof(void*):%u\n”,sizeof(long),sizeof(void*);返回0;}$gcc test\u pointer\u size.c$./a.out sizeof(长):8 sizeof(空*):8
unsigned short Hash( void *p ) {
   unsigned int val = reinterpret_cast<unsigned int>( p );
   return ( unsigned short )( val ^ (val >> 16));
}