C ++指针作为DWORD

时间:2014-01-03 23:28:32

标签: c++ pointers casting dword

在C ++中,我可以简单地将指针强制转换为DWORD吗?

MyClass * thing;
DWORD myPtr = (DWORD)thing;

那会有用吗?

4 个答案:

答案 0 :(得分:5)

在Windows中,以这种方式传递指针是很常见的,例如在windows消息中。 LPARAM是LONG_PTR的typedef,通常用于将指针传递给某些结构。您应该使用reinterpret_cast<DWORD_PTR>(thing)进行投射。

答案 1 :(得分:5)

你无疑可以这样做。

它是否有效将取决于环境以及您希望它做什么。

在32位Windows 1 (最常见的DWORD位置)上通常会没问题。在64位Windows(您也看到DWORD,但不是那么多),它通常不会。


  1. 或者,更准确地说,当编译为32位可执行文件时,无论Windows的实际副本是否运行,都会以32位进程运行。

答案 2 :(得分:1)

不,在64位进程中,指针是64位,但DWORD只有32位。使用DWORD_PTR。

答案 3 :(得分:1)

http://en.cppreference.com/w/cpp/language/explicit_cast

阅读,了解这一点,避免使用C风格的演员表,因为它们隐藏了很多。

这样做可能是可行的,但没有意义,例如DWORD是4个字节,指针(这些天)是8。

reinterpret_cast<DWORD&>(myPtr);

应该有效,但它可能是未定义的或截断的,如果有什么可行的话!

BTW,reinterpret_cast是C ++的说法“相信我亲爱的编译器,我知道我在做什么” - 它试图将一件事的位(0和1)解释为另一件事,无论如何这有多大意义。

合法用途虽然是着名的1 / sqrt hack;)