(目录)
1.void *是什么
我们之前学过许多类型的指针变量,如整形指针,字符指针,甚至数组指针,函数指针等。
int a = 10;
int *pa = &a;//整形指针pa接受一个整形变量a的地址
但是一个指针只能接受一个同类型变量的地址,如pa
只能接受a
的地址
如果用一个整形指针变量接受一个float
类型的地址,程序就会报错
float a = 1,2f;
int* p;
p = &a;
//此代码运行会出错
所以有没有一种类型的指针变量可以接受收任何一种类型变量的地址呢?
答案就是:void*
int a = 10;
char c = 'c';
float f = 1.2f;
void*p = NULL;
p = &a;
p = &c;
p = &f;
void*
类型指针可以接受任何类型的变量的地址,它就像一个“垃圾桶”一样,任何的地址都可以往里面“扔”
2.void*的解引用
在前面的学习中得知,指针类型变量都可以进行解引用,取出指针中存放的地址所指向的值
int a = 10;
int*pa = &a;
printf("%d",*pa);//解引用pa
那么对void类型的指针解引用可以吗?
int a = 10;
void*p = &a;
int num = *p;
在编译器里显示错误:
这里显示错误的原因是因为编译器判断不出void
类型的指针中存放什么类型的值
所以想要对void
类型变量进行解引用,就需要将void
类型变量进行强制类型转换,从void*
强制转换为这个指针中存储的地址指向的值的类型
如上面那个错误的代码,因为a
是int
类型,所以后面要先将p
强转成int*
类型,然后再解引用
int a = 10;
void*p = &a;
int num = *(int*)p;
printf("%d",num);
接下来才能运行成功
前面得知,当void*
不强制类型转换是不可以解引用的,同理,void
类型指针也是不可以进行与数字相加减的
int a = 10;
void*p = &a;
p++;//错误
原因是:既然 void 是无类型,那么每次算术运算我们就不知道该操作几个字节
3.void*类型的应用场景
void*
主要用在一些函数传参中,因为在某些函数中,不知道会接受到什么类型的指针,所以用void*
接受。
比如memcpy
函数,memset
和qsort
C语言库函数中都用到了void*