C语言中的void*是什么?

文章介绍了void*指针的性质和使用规则。void*是一种通用指针类型,能存储任何类型变量的地址,但需要强制类型转换后才能解引用。void*常用于函数参数,以适应处理不同类型的指针。未进行类型转换直接解引用或进行算术运算会导致编译错误。
摘要由CSDN通过智能技术生成

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*强制转换为这个指针中存储的地址指向的值的类型

如上面那个错误的代码,因为aint类型,所以后面要先将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 qsortC语言库函数中都用到了void*

  • 14
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

疯癫了的狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值