C语言中的void*是什么?

简介: 我们之前学过许多类型的指针变量,如整形指针,字符指针,甚至数组指针,函数指针等。

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;


在编译器里显示错误:


99d852a384434a6ab2d5f10e007c6672.png

这里显示错误的原因是因为编译器判断不出void类型的指针中存放什么类型的值


所以想要对void类型变量进行解引用,就需要将void类型变量进行强制类型转换,从void*强制转换为这个指针中存储的地址指向的值的类型


如上面那个错误的代码,因为a是int类型,所以后面要先将p强转成int*类型,然后再解引用


int a = 10;
void*p = &a;
int num = *(int*)p;
printf("%d",num);


接下来才能运行成功


1337cd5b3354473d987953fba924477b.png

前面得知,当void*不强制类型转换是不可以解引用的,同理,void类型指针也是不可以进行与数字相加减的


int a = 10;
void*p = &a;
p++;//错误


原因是:既然 void 是无类型,那么每次算术运算我们就不知道该操作几个字节


3.void*类型的应用场景


void*主要用在一些函数传参中,因为在某些函数中,不知道会接受到什么类型的指针,所以用void*接受。

比如memcpy函数,memset 和qsortC语言库函数中都用到了void*


目录
相关文章
|
4月前
|
测试技术 C语言
C语言中的void函数
C语言中的void函数
212 1
|
存储 Linux 编译器
【C语言】void 和 void* 类型
定义 void 类型的变量
|
C语言
c语言 指针的大小,void *
不同编译环境下,指针的大小不一样: 32 位编译环境下,是4 字节 64 位编译环境下,是8 字节
228 0
|
编译器 C语言
C语言 void数据类型
C语言 void数据类型
197 0
|
编译器 C语言 开发者
【C 语言】数据类型本质 ( void 关键字作用 | 数据类型封装 | 作为 参数 或 返回值 代表无 | void* 指针赋值与被赋值 | void 类型变量不存在 )
【C 语言】数据类型本质 ( void 关键字作用 | 数据类型封装 | 作为 参数 或 返回值 代表无 | void* 指针赋值与被赋值 | void 类型变量不存在 )
288 0
|
C语言
C语言之typedef void (*T) (void *)
C语言之typedef void (*T) (void *)
348 0
|
C语言
C语言-void类型作为万能指针类型
C语言-void类型作为万能指针类型
174 0
|
C语言
C语言-void类型作为万能指针类型
void类型在基本数据类型里是`空类型`,`无类型`;
177 0