有人可以解释PVOID
是什么以及如何在以下函数中使用它:
BOOL DoSomething(PVOID pMemPhy)
答案 0 :(得分:21)
void指针,与
相同void *pMemPhy
又名“指向某事物的指针,但这取决于你解决问题”。
BOOL DoSomething ( PVOID pMemPhy )
{
strcpy((char *)pMemPhy, "I love buffer overflows!");
return TRUE;
}
答案 1 :(得分:12)
它是一个 void指针 - 指向内存地址的指针,没有关于它指向的值类型的信息。因此,在使用指针之前必须将指针强制转换为(char *)pMemPhy
或(int *)pMemPhy
这样的类型,以便编译器知道它使用了多少内存(char为1个字节,4个字节为一个int等。)
答案 2 :(得分:4)
typedef void * PVOID;
如果您有疑问是什么用途是无效指针?最常见的用途是当你将指针传递给并不真正关心类型的内存时。例如,free()。
如果一个库导出一个可以采用多种指针类型的函数,但是想要支持没有函数重载的C这样的语言,那么void *可以工作。
答案 3 :(得分:4)
正如其他人所说,它相当于void *
。
void
指针通常用于内存操作(memcpy
,memset
等...),因为人们不想假定给定地址的数据类型。
来自this的http://cplusplus.com文章中的指针和无效指针得到了很好的处理。
答案 4 :(得分:4)
这个和其他助记符如BOOL,LPCTSTR源于Windows,BTW是在C标准存在之前开发的,并且不依赖于特定的编译器它使用自己的类型。
您可以查看Old New Thing博客,了解有关Windows开发历史的更多故事,以及它们将留给我们的奇怪之处(http://blogs.msdn.com/oldnewthing)。
答案 5 :(得分:1)
听起来它只是void *的别名(define或typedef)。我不知道为什么人们认为会更好,但我知道有些API喜欢使用它,以防将来类型的实现发生变化。
我知道早期版本的Windows使用STDCALL之类的东西作为许多函数的前缀,而STDCALL的定义可能会根据您编译的Windows版本而改变。这是来自记忆(多年后受酒精影响:-),所以不要依赖于此作为福音。它基本上是正确的,但细节可能会有所不同。