3

我找到了这个函数定义

void *func(void *param) {

}

实际上,我对这个函数定义有些困惑。void * 在函数的返回类型和参数中是什么意思。我是C的初学者。所以请不要介意。谢谢

void *func(void *param) {
  int s = (int)param;
  ....
}

看看我发现的上面的程序。我认为应该是

int *s = (int *)param;

不是吗?我很困惑

4

5 回答 5

5

void *意味着它是一个没有特定类型的指针,把它想象成一个通用指针,不像int *一个 int 指针。

如果需要,您可以将其转换为不同的类型(例如,如果您要使用指针进行指针运算)。

您可能会发现这个 SO 使用问题:Concept of void pointer in C programming

于 2012-09-01T03:07:06.923 回答
2

它只是意味着该函数func接受一个参数,该参数是一个指针(指向任何东西)并返回一个指针(指向任何东西)。当您使用 avoid *时,您是在告诉编译器“这是一个指针,但此时它指向什么并不重要”。

当您想实际使用它所指向的数据时,您需要将其转换为指向其他类型的指针。例如,如果它指向一个int,您可以创建一个int *变量并取消引用:

int *int_ptr = (int *)param;
// now (*int_ptr) is the value param is pointing to
于 2012-09-01T03:13:38.320 回答
1

你可以把它想象成一个原始指针,只不过是一个地址,想想看,指针只不过是地址正确,所以它们应该都是相同的大小,在大多数现代系统中都是 32 位或 64 位,但如果那就是如果它们的大小都相同,为什么我们要说int *char *等等,那是因为我们需要一种方法来解释我们指向的类型,int *这意味着当我们取消引用时转到该地址并将 4 个字节解释为intchar *意味着当我们取消引用到那个地址并获得一个字节时,当你取消引用一个void *井时会发生什么,你得到的warning: dereferencing ‘void *’ pointer基本上我们真的不能,如果你做它的影响取决于编译器,当我们对其进行算术运算时同样适用。

那么为什么要麻烦使用它们呢?好吧,我个人不喜欢,有些团体也不特别喜欢它们,从根本上说,它们允许您创建相当通用的子例程,一个很好的例子是memset将一块内存设置为某个字节值,它的第一个参数是 avoid *所以它不会不要抱怨是否给出char *int *适当的注意它在每个字节的基础上工作,并且您需要正确计算数组的总大小。

于 2012-09-01T03:52:29.143 回答
0
void *func(void *param) {

}

param 是一个 void 指针,表示它是任何引用类型的指针。由于 void 指针没有对象类型,除非是大小写,否则它不能被取消引用。

so void *param;
   int *s=(int*)param;

在这里,因为 param 是一个指针变量,所以你必须将它转换为指针变量。而不是像你在那里所做的那样转换为 int 类型。

例如

int x;
 float r;
 void *p=&x;
 int main()
 {
   *(int *)p=2;
     p=&r;
   *(float*)p=1.1;
 }

在这个例子中 p 是一个空指针。现在在 main 方法中,我将 p 转换为 int 指针,然后转换为 float 指针,以便它可以先引用一个整数,然后再引用一个浮点数。

于 2012-09-01T04:01:58.760 回答
0

返回任何类型的指针。它可以是任何数据类型。

于 2012-09-01T03:20:40.367 回答