C++ 指针作为 DWORD
C++ Pointer as DWORD
在C++中,我可以简单地将指针投射到DWORD吗?
MyClass * thing;
DWORD myPtr = (DWORD)thing;
这样行得通吗?
你无疑可以做到。
它是否有效将取决于环境和您希望它做什么。
在 32 位 Windows1(最常见的查看DWORD
位置)上,通常没问题。在 64 位 Windows 上(您也可以看到 DWORD
,但不会那么多),它通常不会。
- 或者,更准确地说,当编译为将作为 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 黑客;)
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 键入从 DWORD 到 64 位指针的强制转换警告
- C++ 指针作为 DWORD
- C/C++ 分配 DWORD 数组的指针地址
- 如何快速清除DWORD指针数组