在 C++ 中,我可以简单地将指针转换为 DWORD 吗?
MyClass * thing;
DWORD myPtr = (DWORD)thing;
那行得通吗?
在 Windows 中,以这种方式传递指针是很常见的,例如在 Windows 消息中。LPARAM 是 LONG_PTR 的 typedef,并且经常用于将指针传递给某些结构。您应该reinterpret_cast<DWORD_PTR>(thing)
用于铸造。
毫无疑问,你可以做到。
它是否会起作用将取决于环境以及您希望它做什么。
在 32 位 Windows 1(最常见的地方DWORD
)上,它通常没问题。在 64 位 Windows 上(您也可以看到DWORD
,但几乎看不到那么多)它通常不会。
不,在 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 hack ;)