我确实试过在SO上搜索这个,但我认为由于语法而且不知道究竟要搜索什么,我变得有点不稳定。
我已经看到(void *)用于强制转换,通常用于函数调用。这是用来做什么的?
答案 0 :(得分:6)
void*
,通常称为 void指针,是一种通用指针类型,可以指向任何类型的对象。指向不同类型对象的指针在内存中几乎相同,因此您可以使用void指针来避免类型检查,这在编写处理多种数据类型的函数时非常有用。
Void指针对C语言比C ++更有用。您通常应该避免使用void指针并使用函数重载或模板。类型检查是一件好事!
答案 1 :(得分:4)
void指针是指向其类型和大小未知的值的指针。我将举例说明如何在C语言中使用它 - 尽管其他评论者在C ++中不应该使用它(事实上,没有必要)是正确的。
假设您有一个存储键和值的结构。它可能定义如下:
typedef struct item_t
{
char *key;
int value;
} item_t;
因此,您可以使用此结构将任何字符串键与整数值进行匹配。但是,如果你想存储一些任意值呢?也许你想要一些键与整数匹配,以及一些键与双打匹配?您需要以这样的方式定义结构:它将跟踪(使用指针)任意类型和大小的值。在这种情况下,void *
符合条款:
typedef struct item_t
{
char *key;
void *value;
} item_t;
现在,如果您的值是int,则可以使用(int *) value
获取其值,或者如果其值为double,则可以使用(double *) value
执行此操作。当然,这假定使用struct的代码知道它希望在什么上下文中看到什么类型。
但是,在C ++中,这种相同的功能通常不是通过使用void *
来实现的,而是通过使用模板或超类来完成所有不同类型的内容(例如Java中的Object,例如 - 对象列表可以存储一些字符串,一些整数等等。)
答案 2 :(得分:1)
这是在C / C ++中提供指向对象的指针的最通用方法。像C#或Java中的对象
答案 3 :(得分:1)
当你想传递一个可以有不同状态的参数
时,主要使用它例如,在您的通用代码中,您将void *作为参数传递,然后在该代码的“Specific”实现中,您可以将void *转换为您想要的任何内容
通用代码abc.h
void Test(void* pHandle);
Windows代码abc.Cpp
void Test(void* phandle)
{
WindowsStructure* myStruct = (WindowsStructure*)(pHandle);
myStruct->getWhatINeed;
}
Linux代码abc.Cpp
void Test(void* phandle)
{
LinuxStructure* myStruct = (LinuxStructure*)(pHandle);
myStruct->getWhatINeed;
}