(void*)强制转换的作用是什么?

What is (void*) casting used for?

本文关键字:作用 是什么 转换 void      更新时间:2023-10-16

我确实尝试在Stack Overflow上搜索这个,但我认为由于语法和不知道究竟要搜索什么,我变得有点混乱。

我见过(void*)被用来强制转换,通常是函数调用。这是干什么用的?

void*,通常被称为void指针,是一种泛型指针类型,可以指向任何类型的对象。指向不同类型对象的指针在内存中几乎是相同的,所以你可以使用void指针来避免类型检查,这在编写处理多种数据类型的函数时非常有用。

Void指针在C中比在c++中更有用。通常应避免使用void指针,而应使用函数重载或模板。类型检查是一件好事!

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。当然,这是假设使用结构体的代码知道它希望在什么上下文中看到什么类型。

在c++中,虽然,相同的功能通常不是通过使用void *来实现的,而是通过使用模板或所有不同类型派生的超类来实现的(例如Java中的Object - Object列表可以存储一些String's,一些Integer's等)。

这主要用于当您想要传递一个可以具有不同状态的参数时。

例如,在泛型代码中,您将传递void*作为参数,然后在该代码的"特定"实现中,您将将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;
}

这是在C/c++中提供指向对象的指针的最通用的方式。如c#或Java中的object