8

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

我已经看到(void*)习惯于转换,通常用于函数调用。这是干什么用的?

4

4 回答 4

7

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

void 指针在 C 中比在 C++ 中更有用。您通常应该避免使用 void 指针,而是使用函数重载或模板。类型检查是个好东西!

于 2013-05-31T22:01:32.720 回答
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 *) value。当然,这假设使用该结构的代码知道它期望在什么上下文中看到什么类型。

但是,在 C++ 中,通常不是通过使用 来实现相同的功能void *,而是通过使用模板或所有不同类型都源自的超类(例如 Java 中的 Object - 对象列表可以存储一些字符串、一些整数等)。

于 2013-05-31T22:09:21.130 回答
1

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

例如,在您的通用代码中,您将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;
}
于 2013-05-31T21:54:12.173 回答
1

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

于 2013-05-31T21:40:05.350 回答