void指针一般被称为通用指针或叫泛指针。它是C语言关于纯粹地址的一种约定。当某个指针是void型指针时,所指向的对象不属于任何类型。
1、void *表示一个“不知道类型”的指针,也就不知道从这个指针地址开始多少字节为一个数据。
和用int表示指针异曲同工,只是更明确是“指针”。
因此void*只能表示一个地址,不能用来&取值,也不能+±-移动指针,因为不知道多少字节是一个数据单位。
2、void *就是一个不能动的“地址”,在进行&、移动指针之前必须转型为类型指针。
3、指针在只知道内存,但是不知道是什么类型的时候。
4、在C/C++中,在任意时刻都可以使用其它类型指针来代替void指针,或者用void指针来代替其他类型指针。
5、对指针变量的解引用,使用间接运算符*达到目的。但是在使用空指针的情况下,需要转换指针变量以解引用。这是因为空指针没有与之关联的数据类型。编译器无法知道void指针指向的数据类型。因此,要获取由void指针指向的数据,需要使用在void指针位置内保存的正确类型的数据进行类型转换。
#include<stdio.h>
int main()
{
int nums[] = {1,2,3,4,5};
void *ptr1 = nums;
//printf("*ptr1 = %d\n",*ptr1);//这样解引用的代码会报错
int *ptr2 = nums;
printf("*ptr2 = %d\n",*ptr2);//ptr2的类型为(int *),正常运行
int *ptr3 = (int*)ptr1;//将ptr1从(void *)强转为(int *)以后,这样就赋予了
//void*一个数据类型指针,可以指向内存的值了
printf("*ptr3 = %d\n",*ptr3);//等效于printf("*ptr2 = %d\n",*ptr2)
printf("ptr1 = %p,ptr2 = %p\n",ptr1,ptr2);//我们发现void *类型和int *类型指向
//的内存是一样的,
return 0;
}
因此:
**1.void型指针解引用须做类型指定。
2.类型转换的时候须注意类型匹配。
3.另外,如果函数类型可以是任意类型的指针,则需将其参数定义为void *指针
比如memset函数的原型:void *memset(void *s, int ch, size_t n);
**