我找到了这个函数定义
void *func(void *param) {
}
实际上,我对这个功能定义有一定的困惑。 void *在函数的返回类型和参数中的含义是什么。我是C的初学者。所以请不要介意。谢谢
void *func(void *param) {
int s = (int)param;
....
}
好好看看我发现的上述程序。我认为应该是
int *s = (int *)param;
不是吗?我很困惑
答案 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
所以它不会抱怨是否给出memset
或void *
到期的注释,它是按字节工作的,并且您需要正确计算数组的总大小。
答案 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指针,然后作为一个浮点指针,以便它可以引用一个整数,然后是一个浮点数。