我找到了这个函数定义
void *func(void *param) {
}
实际上,我对这个函数定义有些困惑。void * 在函数的返回类型和参数中是什么意思。我是C的初学者。所以请不要介意。谢谢
void *func(void *param) {
int s = (int)param;
....
}
看看我发现的上面的程序。我认为应该是
int *s = (int *)param;
不是吗?我很困惑
void *
意味着它是一个没有特定类型的指针,把它想象成一个通用指针,不像int *
一个 int 指针。
如果需要,您可以将其转换为不同的类型(例如,如果您要使用指针进行指针运算)。
您可能会发现这个 SO 使用问题:Concept of void pointer in C programming
它只是意味着该函数func
接受一个参数,该参数是一个指针(指向任何东西)并返回一个指针(指向任何东西)。当您使用 avoid *
时,您是在告诉编译器“这是一个指针,但此时它指向什么并不重要”。
当您想实际使用它所指向的数据时,您需要将其转换为指向其他类型的指针。例如,如果它指向一个int
,您可以创建一个int *
变量并取消引用:
int *int_ptr = (int *)param;
// now (*int_ptr) is the value param is pointing to
你可以把它想象成一个原始指针,只不过是一个地址,想想看,指针只不过是地址正确,所以它们应该都是相同的大小,在大多数现代系统中都是 32 位或 64 位,但如果那就是如果它们的大小都相同,为什么我们要说int *
或char *
等等,那是因为我们需要一种方法来解释我们指向的类型,int *
这意味着当我们取消引用时转到该地址并将 4 个字节解释为int
或char *
意味着当我们取消引用到那个地址并获得一个字节时,当你取消引用一个void *
井时会发生什么,你得到的warning: dereferencing ‘void *’ pointer
基本上我们真的不能,如果你做它的影响取决于编译器,当我们对其进行算术运算时同样适用。
那么为什么要麻烦使用它们呢?好吧,我个人不喜欢,有些团体也不特别喜欢它们,从根本上说,它们允许您创建相当通用的子例程,一个很好的例子是memset
将一块内存设置为某个字节值,它的第一个参数是 avoid *
所以它不会不要抱怨是否给出char *
或int *
适当的注意它在每个字节的基础上工作,并且您需要正确计算数组的总大小。
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 指针,以便它可以先引用一个整数,然后再引用一个浮点数。
返回任何类型的指针。它可以是任何数据类型。