到目前为止,我们已经研究了分配给指针的地址应该与指针声明中指定的类型相同。 例如,如果我们声明了int指针,则此int指针不能指向float变量或某种其他类型的变量,即它只能指向int类型的变量。 为了克服这个问题,我们使用了指向void的指针。 指向void的指针表示可以指向任何数据类型的通用指针。 我们可以将任何数据类型的地址分配给void指针,并且可以将void指针分配给任何类型的指针,而无需执行任何显式的类型转换。
void *pointer name;
下面给出了void指针的声明:
void *ptr;
在上面的声明中,void是指针的类型,而'ptr'是指针的名称。
让我们看一些示例:
int i=9; //整型变量的初始化。 int *p; // 整数指针声明。 float *fp; // 浮点指针声明。 void *ptr; //void指针声明。 p=fp; // 错误. fp=&i; // 错误 ptr=p; // 正确 ptr=fp; // 正确 ptr=&i; // 正确
C语言中void指针的大小与字符类型的指针的大小相同。指向void的指针的表示形式与字符类型的指针相同。指针的大小将根据所使用的平台而有所不同。
让我们看下面的实例:
#include <stdio.h> int main() { void *ptr = NULL; //void 指针 int *p = NULL;// 整型指针 char *cp = NULL;//字符指针 float *fp = NULL;//浮点指针 //void指针的大小 printf("void指针的大小 = %d\n\n",sizeof(ptr)); //整型指针的大小 printf("整型指针的大小 = %d\n\n",sizeof(p)); //字符指针的大小 printf("字符指针的大小 = %d\n\n",sizeof(cp)); //浮点指针的大小 printf("浮点指针的大小 = %d\n\n",sizeof(fp)); return 0; }
输出结果
void指针的大小 = 4 整型指针的大小 = 4 字符指针的大小 = 4 浮点指针的大小 = 4
以下是void指针的优点:
malloc()和calloc()函数返回void指针,因此这些函数可用于分配任何数据类型的内存。
#include <stdio.h> #include<malloc.h> int main() { int a=90; int *x = (int*)malloc(sizeof(int)) ; x=&a; printf("x指针所指向的值 : %d",*x); return 0; }
输出结果
x指针所指向的值 : 90
C中的void指针也可以用于实现C中的泛型函数。
由于其可重用性,我们使用void指针。void指针可以存储任何类型的对象,并且我们可以通过使用带有适当类型转换的间接操作符来检索任何类型的对象。
让我们通过一个实例来理解。
#include<stdio.h> int main() { int a=56; //初始化一个整数变量'a'。 float b=4.5; //浮点变量'b'的初始化。 char c='k'; //字符变量'c'的初始化。 void *ptr; //声明空指针。 // 为变量“a”分配地址。 ptr=&a; printf("a的值为 : %d",*((int*)ptr)); //为变量'b'分配地址。 ptr=&b; printf("\nb的值为 : %f",*((float*)ptr)); //为变量'c'分配地址。 ptr=&c; printf("\n c的值为 : %c",*((char*)ptr)); return 0; }
输出结果
a的值为 : 56 b的值为 : 4.500000 c的值为 : k