在 C 语言 中,void 的意思就是 “无类型”,void 指针则为 “无类型指针”,void 指针可以指向 任何类型 的数据。所以 void 指针一般被称为通用指针或者泛指针,也可以叫做万能指针。
void *p
我们使用 void *
定义了一个万能指针。
*((int*)pa
我们将一个 void 类型的指针 pa,转换成了 int 类型的指针,并取其值。
void 指针可以指向任何数据
#include <stdio.h>
int main()
{
printf("嗨客网(www.haicoder.net)\n\n");
int a = 1024;
void *pa = &a;
printf("pa = %p\n", pa);
return 0;
}
程序运行后,控制台输出如下图所示:
我们首先,定义了一个 int 类型的变量 a,接着,我们定义了一个 void 类型的指针,该指针用来保存了 int 类型的变量的地址,因此,我们可以看出,void 指针可以保存任何数据类型的地址。
void 指针不可以直接使用,必须经过类型转换后才可以使用
#include <stdio.h>
int main()
{
printf("嗨客网(www.haicoder.net)\n\n");
int a = 1024;
void *pa = &a;
printf("pa = %p, *pa = %d\n", pa, *pa);
return 0;
}
程序运行后,控制台输出如下图所示:
我们直接使用 *pa
,打印了 void 指针指向的变量的值,我们发现程序报错,因为,void 指针不可以直接使用,必须经过 强制类型转换,现在,我们将程序修改如下:
#include <stdio.h>
int main()
{
printf("嗨客网(www.haicoder.net)\n\n");
int a = 1024;
void *pa = &a;
printf("pa = %p, *pa = %d\n", pa, *((int*)pa));
return 0;
}
程序运行后,控制台输出如下图所示:
这次,我们在打印的时候,将 void 指针强制类型转换成了 int 指针,最后,我们看到可以正确输出了 void 指针指向的值,因此,void 指针不可以直接使用,必须强制类型转换后才可以使用。
任何指针无需强制类型转换,都可以赋值给 void 指针
#include <stdio.h>
int main()
{
printf("嗨客网(www.haicoder.net)\n\n");
int *pa;
double *pb;
long *pc;
void *vpa = pa;
vpa = pb;
vpa = pc;
return 0;
}
程序运行后,控制台输出如下图所示:
我们可以看到,我们分别将 int 类型的指针、double 类型的指针和 long 类型的指针赋值给了 void 类型的指针,因此,我们可以看出,void 类型的指针可以接受任何类型的指针变量。
在 C 语言中,void 指针可以指向任何类型的数据。所以 void 指针一般被称为通用指针或者泛指针,也可以叫做万能指针。在 C 语言中在任何时候都可以用 void 类型的指针来代替其他类型的指针,void 指针可以指向任何数据类型的变量。
如果要通过 void 指针去获取它所指向的变量值时候,需要先将 void 指针强制类型转换成和变量名类型相匹配的数据类型指针后再进行操作。任何类型的指针都可以赋值给 void 指针,无需进行强制类型转换。