无类型指针(void *)与显式类型转化
void *(无类型)指针可以指向任意类型的数据,即可以用任意类型的指针对void指针赋值。例如:
int *pint ;
void *pvoid ; //它没有类型,或者说这个类型不能判断出指向对象的长度
pvoid = pint ; //只获得变量/对象地址而不获得大小,即pvoid的指针类型还是没有转变
//但是不允许 pint=pvoid;
printf("%d",*pint); //正确
printf("%d",*pvoid); //错误,pvoid不是指向某类型的指针
printf("%d",*(int *)pvoid); //正确,同printf("%d",*pint);
-
在C语言中,可以把任何类型的指针(包括函数指针)赋值给void*指针而无须进行强制类型转换。
在C++中,对这个转换做了更严格的限制:只有非 常量指针才能赋值给void*指针。
C++示例代码:const char pp[10] = {0}; const char* str = "aaa"; //pp与str均为指向常量区的指针 void* pv = NULL; pv = pp;//错误,不能将常量指针赋值给void *指针 pv = str;//错误,不能将常量指针赋值给void *指针
-
如果要将pvoid赋给其他类型指针,则需要强制类型转换如:
pint = (int *)pvoid; //转换类型也就是获得指向变量/对象大小
-
void指针在强制转换成具体类型前,不知道指向对象的(字节)大小,不能解引用(即取内容的意思);
【Eg】 void *pvoid=pint;
*pvoid //错误;
-
void指针不能参与指针运算,除非进行转换。
只知道地址,不知道指针类型(大小),
即:参与运算的指针必须是确定知道其指向数据类型大小的。
-
void指针的应用
当进行纯粹的内存操作的时候,或者传递一个指向未定类型的指针时,可以使用void指针;
典型的如内存操作函数memcpy和memset的函数原型分别为:
void * memcpy(void *dest,constvoid * src,size_tlen);
void * memset(void * buffer,intc,size_tnum);
这样,任何类型的指针都可以传入memcpy和memset中,这也真实地体现了内存操作函数的意义,因为它操作的对象仅仅是一片内存,而不论这片内存是什么类型。
注意memcpy和memset函数返回的也是void*类型。
【注】:malloc函数的返回类型是void,*
int p =(int)malloc(100sizeof(int));
进行了强制性转化。