【问题标题】:What is PVOID data type?什么是 PVOID 数据类型?
【发布时间】:2010-10-04 09:30:39
【问题描述】:

谁能解释一下PVOID 是什么以及它是如何在如下函数中使用的:

BOOL DoSomething(PVOID pMemPhy)

【问题讨论】:

标签: c++ pointers com


【解决方案1】:

空指针,同

void *pMemPhy

又名“指向某物的指针,但由您自己决定”。

BOOL DoSomething ( PVOID pMemPhy )
{
    strcpy((char *)pMemPhy, "I love buffer overflows!");
    return TRUE;
}

【讨论】:

    【解决方案2】:

    听起来它只是 void* 的别名(define 或 typedef)。我不知道为什么人们认为这会更好,但我知道一些 API 喜欢使用它,以防将来类型的实现发生变化。

    我知道早期版本的 Windows 使用诸如 STDCALL 之类的东西作为许多函数的前缀,并且 STDCALL 的定义可能会根据您编译的 Windows 版本而改变。这是来自记忆(多年后受酒精影响:-),所以不要把它当作福音。基本是对的,但细节可能有点不同。

    【讨论】:

      【解决方案3】:
      typedef void * PVOID;
      

      如果你的问题是空指针有什么用?最常见的用途是当您将指针传递给并不真正关心类型的内存时。例如,free()。

      如果一个库导出一个可以采用多种指针类型的函数,但又想支持像 C 这样没有函数重载的语言,那么 void * 可以工作。

      【讨论】:

        【解决方案4】:

        它是一个 void 指针 -- 一个指向内存地址的指针,没有关于它所指向的值的类型的信息。因此,您必须在使用指针之前将指针转换为 (char *)pMemPhy(int *)pMemPhy 等类型,以便编译器知道它正在使用多少内存(char 为 1 个字节,int 为 4 个字节,等等.)

        【讨论】:

        • @Jeremy Ruten,在这种情况下,如果是物理内存地址,我应该把它转换成什么?
        • 不管它是什么样的内存地址(我不确定你所说的“物理内存地址”是什么意思),只要把它转换成你想让你的函数处理它的任何类型作为。这取决于函数想要完成什么,但我认为大多数时候你会转换为 (char *)。
        • 这实际上是一个API函数。根据描述,该函数打开接口卡上的一个端口。可用信息不多,所以我不知道如何处理参数“PVOID pMemPhy”。
        • 哦,如果你所做的只是调用那个函数(而不是实现它),不需要做任何转换。只需将您的指针传递给该函数,该函数将处理其余部分。至于函数希望你传递给它什么,我帮不了你......
        【解决方案5】:

        正如其他人所说,它相当于void *

        void 指针通常用于内存操作(memcpymemset 等...),因为人们不想假设给定地址的数据类型。

        thishttp://cplusplus.com 的文章中对指针和 void 指针进行了很好的处理。

        【讨论】:

          【解决方案6】:

          这个和其他助记符如 BOOL、LPCTSTR 起源于 Windows,顺便说一句,Windows 是在 C 标准存在之前开发的,并且不依赖于使用自己的类型的特定编译器。

          您可以查看 Old New Thing 博客,了解有关 Windows 开发历史的更多故事,以及我们将继续关注的奇事 (http://blogs.msdn.com/oldnewthing)。

          【讨论】:

            猜你喜欢
            • 2012-05-16
            • 1970-01-01
            • 1970-01-01
            • 2010-09-19
            • 2012-05-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多