关于C中函数定义的困惑

时间:2012-09-01 03:05:56

标签: c function

我找到了这个函数定义

void *func(void *param) {

}

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

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

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

int *s = (int *)param;
不是吗?我很困惑

5 个答案:

答案 0 :(得分:5)

void *表示它是一个没有特定类型的指针,将其视为通用指针,而不像int *一个int指针。

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

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

答案 1 :(得分:2)

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

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

int *int_ptr = (int *)param;
// now (*int_ptr) is the value param is pointing to

答案 2 :(得分:1)

你可以把它想象成一个原始指针,只不过是一个地址,想一想,指针只不过是正确的地址,所以它们都应该是相同的大小,在大多数现代系统中都是32或64位但是如果就是这种情况,为什么我们会说int *char *左右,如果它们的大小都相同,那就好了,因为我们需要一种方法来解释我们指向的类型,{{1当我们取消引用去那个地址并将4个字节解释为int *int意味着当我们取消引用去那个地址并得到一个字节时,意味着当你取消引用{{{}时会发生什么? 1}}你得到char *基本上我们真的不能,如果你做它的影响是依赖于编译器的,当我们对其进行算术时也是如此。

那么为什么要使用它们呢?好吧我个人没有,有些小组不特别喜欢它们,从根本上它们允许你创建相当通用的子程序,一个很好的例子是void *它将一块内存设置为某个字节值,它的第一个参数是一个warning: dereferencing ‘void *’ pointer所以它不会抱怨是否给出memsetvoid *到期的注释,它是按字节工作的,并且您需要正确计算数组的总大小。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

void *func(void *param) {

}

param是一个void指针,意味着它是任何引用类型的指针。由于void指针没有对象类型,因此除非是大小写,否则无法解除引用。

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

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

e.g。

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

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