C++ 指针作为 DWORD

C++ Pointer as DWORD

本文关键字:DWORD 指针 C++      更新时间:2023-10-16

在C++中,我可以简单地将指针投射到DWORD吗?

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

这样行得通吗?

你无疑可以做到。

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

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


  1. 或者,更准确地说,当编译为将作为 32 位进程运行的 32 位可执行文件时,无论您碰巧在哪个 Windows 上运行它的实际副本。

在窗口中,以这种方式传递指针是很常见的,例如在Windows消息中。LPARAM 是用于LONG_PTR的类型定义,通常用于将指针传递给某些结构。您应该使用reinterpret_cast<DWORD_PTR>(thing)进行铸造。

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

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

阅读,理解这一点,避免使用 C 样式的转换,因为它们隐藏了很多。

这样做也许可以做到,但毫无意义,例如 DWORD 是 4 个字节,指针(现在)是 8 个字节。

reinterpret_cast<DWORD&>(myPtr);

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

顺便说一句,reinterpret_cast是说"相信我,我亲爱的编译器,我知道我在做什么"的C++方式——它试图将一件事的位(0 和 1)解释为另一件事,不管这有多大意义。

一个合法的用途是著名的 1/sqrt 黑客;)