C语言中函数定义的混淆问题

3
我发现了这个函数定义。
void *func(void *param) {

}

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

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

看了上面我找到的程序,我认为它应该是这个样子的。

int *s = (int *)param;

不是吗?我感到困惑。

5个回答

5

void * 意味着它是一个没有特定类型的指针,可以将其视为通用指针,不像 int * 只是 int 指针。

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

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


你甚至不需要将它强制转换为其他类型,它可以自动转换为任何其他对象指针。 - Jens Gustedt

2
这意味着函数func接受一个指向任何东西的指针作为参数,并返回一个指向任何东西的指针。当你使用void *时,你告诉编译器“这是一个指针,但在这一点上它指向什么并不重要”。
当你想要使用它所指向的数据时,你需要将其转换为指向其他类型的指针。例如,如果它指向一个int,你可以创建一个int *变量并对其进行解除引用:
int *int_ptr = (int *)param;
// now (*int_ptr) is the value param is pointing to

1

你可以将其视为原始指针,仅仅是一个地址。想一想,指针不过是地址而已,因此它们应该都是相同的大小,大多数现代系统中都是32位或64位。但如果是这样的话,为什么我们会说int *char *等等,如果它们都是相同的大小呢?那是因为我们需要一种方式来解释我们所指向的类型,int *表示当我们解引用时,转到该地址并将4个字节解释为int,或者char *表示当我们解引用时,转到该地址并获取一个字节。那么当您解引用void *时会发生什么呢?您会得到warning: dereferencing ‘void *’ pointer,基本上我们真的不能这样做,如果您这样做,其影响取决于编译器,当我们对其进行算术运算时也是如此。

那么为什么要使用它们呢?我个人不太喜欢,有些团队也不是很喜欢。但从根本上讲,它们允许您创建相当通用的子程序,一个很好的例子是 memset,它将一块内存设置为特定的字节值,它的第一个参数是 void *,因此无论是给出 char * 还是 int * 都不会报错,需要注意的是它按每个字节处理,并且您需要正确计算数组的总大小。

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是一个空指针。现在在主方法中,我将p强制转换为int指针,然后再转换为float指针,以便它可以先引用整数,然后引用浮点数。

0

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


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