关于在标准C中的(void*)作为传递参数和返回类型的问题
(void )可以被看成一个泛型,泛型的意思就是说我们可以向其中传递任何类型的数据,可以在运行时为其动态指派特定的类型。在(void)被作为一个参数的时候,在调用该函数的时候可以向其中传递任意类型的参数(注意:参数必须是指针类型的变量)。从这一点上来看它的功能比较类似C++中的模板。
不过若是将void*赋值给其他类型的参数,那么需要进行类型转换。
从语法上来说,(void*)是一个空指针类型,他不指向任何类型,仅仅是个地址而已,所以它不能进行自加或者自减运算
例:
void *p; //仅仅表示p存放一个地址;
p++; //error!+,-运算离不开指针类型;
*p=2; //error!必须指明类型
int a=1;
p=&a; //正确;
a=(int *)p //正确;
如果(void*)作为一个函数的返回值,那么可以将它认为它可以返回任意类型的指针。同样的,在调用函数中我们也应该定义一个void类型的指针用于接受void类型的返回值,同理,在使用它或者输出它时,要将其转化为对应类型的指针才可以使用。以下是一个简短的例子。
#include <stdio.h>
void Number1(void *a)
{
int *num;
num=(int *)a;
printf("%d\n",*num);
}
void String(void *s)
{
char *s1;
s1=(char *)s;
printf("%s",s1);
}
void *Number(void *a)
{
int *num;
num=(int *)a;
return num;
}
void main()
{
int a=10;
void *b;
char *ch="String";
b=Number(&a);
printf("%d\n",*((int *)b));
String(ch);
}
相信这个例子已经足够的详细了。