到目前為止,我們已經(jīng)研究了分配給指針的地址應(yīng)該與指針聲明中指定的類型相同。 例如,如果我們聲明了int指針,則此int指針不能指向float變量或某種其他類型的變量,即它只能指向int類型的變量。 為了克服這個問題,我們使用了指向void的指針。 指向void的指針表示可以指向任何數(shù)據(jù)類型的通用指針。 我們可以將任何數(shù)據(jù)類型的地址分配給void指針,并且可以將void指針分配給任何類型的指針,而無需執(zhí)行任何顯式的類型轉(zhuǎn)換。
void *pointer name;
下面給出了void指針的聲明:
void *ptr;
在上面的聲明中,void是指針的類型,而'ptr'是指針的名稱。
讓我們看一些示例:
int i=9; //整型變量的初始化。 int *p; // 整數(shù)指針聲明。 float *fp; // 浮點(diǎn)指針聲明。 void *ptr; //void指針聲明。 p=fp; // 錯誤. fp=&i; // 錯誤 ptr=p; // 正確 ptr=fp; // 正確 ptr=&i; // 正確
C語言中void指針的大小與字符類型的指針的大小相同。指向void的指針的表示形式與字符類型的指針相同。指針的大小將根據(jù)所使用的平臺而有所不同。
讓我們看下面的實(shí)例:
#include <stdio.h> int main() { void *ptr = NULL; //void 指針 int *p = NULL;// 整型指針 char *cp = NULL;//字符指針 float *fp = NULL;//浮點(diǎn)指針 //void指針的大小 printf("void指針的大小 = %d\n\n",sizeof(ptr)); //整型指針的大小 printf("整型指針的大小 = %d\n\n",sizeof(p)); //字符指針的大小 printf("字符指針的大小 = %d\n\n",sizeof(cp)); //浮點(diǎn)指針的大小 printf("浮點(diǎn)指針的大小 = %d\n\n",sizeof(fp)); return 0; }
輸出結(jié)果
void指針的大小 = 4 整型指針的大小 = 4 字符指針的大小 = 4 浮點(diǎn)指針的大小 = 4
以下是void指針的優(yōu)點(diǎn):
malloc()和calloc()函數(shù)返回void指針,因此這些函數(shù)可用于分配任何數(shù)據(jù)類型的內(nèi)存。
#include <stdio.h> #include<malloc.h> int main() { int a=90; int *x = (int*)malloc(sizeof(int)) ; x=&a; printf("x指針?biāo)赶虻闹?nbsp;: %d",*x); return 0; }
輸出結(jié)果
x指針?biāo)赶虻闹?nbsp;: 90
C中的void指針也可以用于實(shí)現(xiàn)C中的泛型函數(shù)。
由于其可重用性,我們使用void指針。void指針可以存儲任何類型的對象,并且我們可以通過使用帶有適當(dāng)類型轉(zhuǎn)換的間接操作符來檢索任何類型的對象。
讓我們通過一個實(shí)例來理解。
#include<stdio.h> int main() { int a=56; //初始化一個整數(shù)變量'a'。 float b=4.5; //浮點(diǎn)變量'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; }
輸出結(jié)果
a的值為 : 56 b的值為 : 4.500000 c的值為 : k