无类型指针作为函数参数。

10
我有一个函数:void *Client(void *threadData){}

你能告诉我关于void *threadData参数的一些事情吗?为什么要使用void *参数?
2个回答

20

void *是一种通用指针,可以指向任何对象类型。上述函数可以接受任何类型的指针,并可以返回任何类型的指针。

如果不确定用户输入的数据类型,可以使用通用指针。

示例:下面的函数将打印任何数据类型,只要用户提供有关数据类型的输入。

void funct(void *a, int z)
{
    if(z==1)
        printf("%d",*(int*)a); // If user inputs 1, then it means the data is an integer and type  casting is done accordingly.
    else if(z==2)
        printf("%c",*(char*)a); // Typecasting for character pointer.
    else if(z==3)
        printf("%f",*(float*)a); // Typecasting for float pointer
}

快速、简单,非常好的回答,也许你可以添加一个在C编程中使用它的示例。 - Rizier123
4
一个 void * 指针不仅可以指向任何指针类型,而且实际上还可以指向任何对象类型。但函数不能接受任何类型的指针,只能接受空指针和对象类型的指针(但不能是函数指针)。 - Kerrek SB
1
@TifuiGabriel; 还可以看看这个答案 - haccks
谢谢,你的回答帮助我理解了这个实践 :)。 - Rapidistul
我正在学习C语言,但在组合代码时遇到了麻烦。当我使用以下代码时 int s = 3; funct(s, 1);,会出现错误。但是当我将参数作为引用传递时,它却可以正常工作 int s = 3; funct(&s, 1);。为什么会这样呢? - Slit

5
假设您想将整数传递给void *Client(void *threadData){}函数,那么您需要:
int integer;

integer = SOME_VALUE;

Client(&integer);

在函数中。
void *Client(void *threadData)
{
    int value;

    value = *(int *)threadData;
}

由于void *可以转换为任何指针类型,因此您可以将需要的任何数据传递给Client()函数。


3
你可以通过向包含数据的结构体传递指针的方式,以同样的通用方式将任何其他类型传递给该函数。 - Jonathan Leffler
好问题(即“通过void *传递数据是否会导致违反严格别名规则?”)。 我不得不先思考才能回答。 我相信答案是“不会”。 假设线程函数为void *thread_func(void *pdata) { … }。 假设您将指向struct SomeThing的指针作为void *传递给函数;在线程函数内部,您首先执行的是SomeThing *args = pdata;(或SomeThing arg = *(SomeThing *)pdata;),这样您仅通过指向正确类型的指针访问数据,而不是通过别名类型的指针访问数据,并且没有严格别名问题。 - Jonathan Leffler
@JonathanLeffler 好的,现在我不会再担心了,因为你说的很有道理。是的,抱歉删除了评论,我以为你不会回答。 - Iharob Al Asimi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接