(void *)cast-这是用来做什么的?

时间:2013-05-31 21:32:41

标签: c++ casting void-pointers

我确实试过在SO上搜索这个,但我认为由于语法而且不知道究竟要搜索什么,我变得有点不稳定。

我已经看到(void *)用于强制转换,通常用于函数调用。这是用来做什么的?

4 个答案:

答案 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;
}