首页 > 其他分享 >C语言中的void*是什么?

C语言中的void*是什么?

时间:2023-09-28 15:31:41浏览次数:31  
标签:变量 int void C语言 pa 类型 什么 指针

(目录)

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函数,memsetqsortC语言库函数中都用到了void*

标签:变量,int,void,C语言,pa,类型,什么,指针
From: https://blog.51cto.com/u_16237630/7640148

相关文章

  • 数据库中什么是内连接、外连接、交叉连接、笛卡尔积;MySQL 的内连接、左连接、右连接有
    一、什么是内连接、外连接、交叉连接、笛卡尔积呢内连接(innerjoin):取得两张表中满足存在连接匹配关系的记录;外连接(outerjoin):不只取得两张表中满足存在连接匹配关系的记录,还包括某张表(或者两张表)中不满足匹配关系的记录。交叉连接(crossjoin):显示两张表所有记录一一对应,没有匹配关系......
  • 工业物联LoRa组网网关是什么?有什么功能?
    为弥补一些工业场景下通信网络无法达到要求的不足,物通博联推出LoRa智能网关(工业物联LoRa组网网关),即可接入LoRa网络,也能兼容其他LoRa终端实现快速组网,可以快速无缝对接第三方应用平台,帮助客户节省布线施工成本,在智能工厂、车间物联、智慧园区等场景广泛应用。生产现场中的各个控制器......
  • 在农村制作鸡肉肠送商店售卖需要什么手续
    在农村制作鸡肉肠并将其送往商店售卖,通常需要遵循一系列法律和卫生规定,以确保产品的安全和合法性。这些要求可能会因地区和国家而异,因此建议您首先与当地的卫生部门或农业部门联系,以获取具体的指导和要求。以下是一般情况下可能需要的一些手续和步骤:注册和许可证:首先,您可能需要......
  • redis为什么这么快、底层磁盘以及IO模型
    一、底层磁盘IO机制Redis是单进程单线程?为什么这么快:进入redis安装目录下执行以下命令,查看setlpush命令的处理效率:./redis-benchmark-tset,lpush-n100000-q根据官方的数据,Redis的QPS可以达到10万左右(每秒请求数)。就我这个虚拟机的性能,可以看到每秒......
  • 开放式嵌入式物联网平台有什么功能
    在万物互联时代,各种工业设备数量和类型日渐增长,嵌入式物联网平台的应用场景也逐渐丰富,与大数据分析、人工智能等技术的结合,更是为嵌入式物联网平台提供开放式的生产环境,设备远程监控、远程控制、远程维护以及数据分析等功能为人们带来各种实用的功能。 数之能推出的工业物联网平台......
  • MySQL InnoDB什么时候更新索引的统计信息?
    MySQLInnoDB的索引统计信息在什么时候更新呢?或者说什么事件会触发InnoDB索引的统计信息更新呢?下面结合参考资料WhenDoesInnoDBUpdatetheIndexStatistics?(DocID1463718.1)[1]简单总结梳理一下(文中大部分知识点来自参考资料)。1:ANALYZETABLE命令ANALYZETABLE命令会......
  • doc和docx文档有什么区别
    1、版本不同.doc是word2003以及之前word保存类型;.docx则是Word2007之后(如2010、2013、2016等)版本的保存类型。2、压缩文件格式不同.doc是传统的XML压缩文件格式。.docx是基于新的XML压缩文件格式;3、占用空间不同同样文档内容,docx对比doc而言,可以节省大量的空间4、访问速......
  • 为什么每个人都说自己变了!
             为什么每个人都说自己变了!这句话我听了不止一遍了。        是真的变了,还是希望自己变化,今天心情很糟,就像这几天济南的天气,睡觉的时候是黑夜,起床的时候也不见白天,大雾,雾里有风,风了有雨,我不知道济南的天气为什么会这么遭,也没心情去考虑。今天早晨qinqin......
  • 实验1 C语言输入输出和简单程序编写
    一、实验目的会使用C语言程序开发环境(vs2010/devc++等),能熟练、正确使用它们编写、编译、运行、调试C程序;知道C程序结构和编码规范,能正确使用;能正确、熟练使用C语言输入输出函数:scanf(),printf(),getchar(),putchar();能灵活、组合使用基本数据类型、运算符和输入输出......
  • 敏捷开发和传统开发有什么区别?以及Scrum管理工具的推荐
    ​敏捷开发和传统开发的区别主要体现在以下几个方面:团队建设不同:敏捷开发以团队为单位,强调团队建设,赋予高度的责任,支持开发、透明的交流环境;传统开发以个人为单位,团队成员之间交付很少。管理流程不同:敏捷开发流程可以简单,但规划与执行必须严谨;传统开发流程复杂,繁琐,静态,变更成本......