C语言void *特殊的指针类型:使用

一: 

1通用指针类型

  • void * 表示无类型指针,它可以指向任何类型的数据对象。与其他具体类型的指针(如 int *char * 等)不同,void * 指针不指向特定类型的数据,因此在使用时需要进行适当的类型转换。

2内存地址的抽象表示

  • 指针本质上是存储内存地址的变量,而 void * 则是对内存地址的一种抽象表示,它不关心所指向的数据的具体类型,只关注内存地址本身。这使得 void * 指针在一些需要通用指针操作的场景中非常有用,例如动态内存分配函数 malloccalloc 和 realloc 等,它们返回的都是 void * 类型的指针,因为这些函数在分配内存时并不知道用户将在这块内存中存储什么类型的数据。

3类型转换的灵活性

  • 由于 void * 可以指向任何类型的数据,所以在使用时可以将其转换为其他任何类型的指针。但这种转换需要开发者明确知道所指向的数据的实际类型,并进行正确的强制类型转换,否则可能会导致程序出现错误。例如:

4函数参数和返回值中的应用

  • 在函数参数和返回值中使用 void * 可以增加函数的通用性和灵活性。例如,一些函数可能需要接受不同类型的数据指针作为参数,或者返回一个可以指向不同类型数据的指针,这时就可以使用 void * 类型。如内存复制函数 memcpy,它的参数和返回值都是 void * 类型,这样它就可以处理各种类型的数据的复制操作

5与其他指针类型的区别

  • 与具体类型的指针相比,void * 指针不能直接进行指针算术运算(如 ++-- 等),因为编译器不知道所指向的数据的类型和大小,无法确定指针移动的步长。而对于具体类型的指针,如 int *,指针移动的步长是 sizeof(int),编译器可以根据指针的类型自动计算。

二: 

1动态内存分配

  • 内存分配函数的返回值:C 语言中的动态内存分配函数 malloccalloc 和 realloc 等,它们用于在堆上分配指定大小的内存空间,并返回一个指向所分配内存起始地址的 void* 指针。这是因为这些函数在分配内存时并不知晓这块内存将被用于存储何种类型的数据,所以统一返回 void* 类型的指针,由程序员根据实际需求进行类型转换后再使用。例如:

2通用数据存储和传递

  • 数据结构中的 void 成员*:在一些数据结构中,可以使用 void* 指针来存储不同类型的数据,从而实现一种通用的数据存储和传递机制。例如,在一个链表节点的数据结构中,可以使用 void* 指针来存储任意类型的数据,使得链表可以容纳不同类型的数据元素:

3函数参数的通用性

  • 接受不同类型指针的函数:当一个函数需要接受多种不同类型的指针作为参数时,可以使用 void* 指针来增加函数的通用性。例如,一个通用的打印函数,它可以接受不同类型的数据指针,并根据数据的类型进行相应的打印操作:

 

4函数指针数组

  • 存储不同类型函数指针:在一些需要根据不同条件调用不同函数的场景中,可以使用 void* 指针来创建函数指针数组,以存储不同类型的函数指针。例如,在一个简单的事件处理系统中,可以定义一个函数指针数组,其中的每个元素都是一个 void* 类型的函数指针,根据不同的事件类型,调用相应的事件处理函数:

4 函数指针使用:

以下是使用 typedef void (*EventHandler)(void *) 来定义函数指针的详细步骤和示例: 

5 定义函数指针类型

  • 首先,typedef void (*EventHandler)(void *) 语句定义了一个名为 EventHandler 的新类型,它代表了一种特定的函数指针类型。这种函数指针指向的函数接受一个 void* 类型的参数,并且返回值为 void
  • 声明函数指针变量

  • 使用 EventHandler 类型来声明函数指针变量。例如:
    EventHandler eventHandler1, eventHandler2;

这样就声明了两个名为 eventHandler1 和 eventHandler2 的函数指针变量,它们都可以指向符合 void (*)(void *) 签名的函数。

6 定义符合签名的函数

  • 接下来,需要定义一些符合 void (*)(void *) 签名的函数,这些函数将被函数指针所指向。例如:
void handleEvent1(void *data) {// 在这里处理事件 1 的逻辑int *num = (int *)data;printf("Handling event 1 with data: %d\n", *num);
}void handleEvent2(void *data) {// 在这里处理事件 2 的逻辑char *str = (char *)data;printf("Handling event 2 with data: %s\n", str);
}

赋值函数指针

  • 将定义好的函数赋值给相应的函数指针变量。例如:
    int num = 10;
    char str[] = "Hello, World!";eventHandler1(&num);
    eventHandler2(str);

 完整的示例代码如下:

#include <stdio.h>typedef void (*EventHandler)(void *);void handleEvent1(void *data) {// 在这里处理事件 1 的逻辑int *num = (int *)data;printf("Handling event 1 with data: %d\n", *num);
}void handleEvent2(void *data) {// 在这里处理事件 2 的逻辑char *str = (char *)data;printf("Handling event 2 with data: %s\n", str);
}int main() {EventHandler eventHandler1, eventHandler2;eventHandler1 = handleEvent1;eventHandler2 = handleEvent2;int num = 10;char str[] = "Hello, World!";eventHandler1(&num);eventHandler2(str);return 0;
}

在这个示例中,通过 typedef 定义了 EventHandler 类型的函数指针,然后声明了两个函数指针变量,并将相应的函数赋值给它们,最后通过函数指针调用了这些函数,实现了根据不同的情况调用不同的事件处理函数的功能。这种方式在事件驱动编程、回调函数等场景中非常有用,可以提高代码的灵活性和可扩展性。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/4524.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

浅谈风力发电并网系统的控制和优化策略

0引言 风能作为一种可再生资源&#xff0c;以其低污染和巨大储量的优势备受青睐。近年来&#xff0c;随着绿色发展战略的持续推进&#xff0c;我国在风力发电技术领域取得了显著成就。风力发电的总装机容量和并网规模持续增长&#xff0c;为农业生产和居民生活提供了丰富的电力…

对想从事大模型领域的技术开发者的建议或看法

“ 学习技术之前&#xff0c;我们首先要搞明白的是我们想要什么&#xff0c;想做什么&#xff0c;而不是稀里糊涂的去学习技术**”** 大模型技术作为目前比较火的技术之一&#xff0c;有很多技术人员想从事大模型方面的开发&#xff0c;但又不知道该怎么入手&#xff0c;应该学…

433、315通信、ev1527、2262编码

目录 ASK介绍EV1527编码芯片介绍模块介绍无线发射芯片无线接收芯片解码程序发射电路原理图 ASK介绍 ASK是幅移键控&#xff0c;通过调幅将数据发送出去&#xff0c;所以发送与接收都是多位二进制数。 ASK如何区分0和1&#xff1f; 0&#xff1a;发送 433.92Mhz 无线波形&…

面向生成式 AI 的向量数据库:架构,性能与未来趋势

导读 向量数据库是高效处理和准确检索高维数据的基石&#xff0c;对于生成式 AI 技术而言至关重要。本文将分享向量数据库的架构设计和实现中的关键点。 主要分为五个方面&#xff1a; 向量数据库背景介绍 Milvus 整体架构设计 性能的关键-索引 面向 AI 持续进化 01 向量…

vulhub之zabbix

zabbix是一款服务器监控软件,其由server、agent、web等模块组成,其中web模块由PHP编写,用来显示数据库中的结果。能够监控各种网络参数以及服务器健康性和完整性。 zabbix的详细介绍: https://blog.csdn.net/wt334502157/article/details/117994107 zabbix latest.php S…

介绍一下如何生成随机数(c基础)

适合对象 c语言初学者 总结语言用色&#xff0c;个人强调用红色&#xff0c;注意为易错点&#xff0c;若有问题请告诉我谢谢。(建议通过目录观看)。一定要自己动手打代码。 rand函数 是生成随机数的函数&#xff0c;但实则是伪随机数。(即是同一个值) 格式 #include<st…

java案例6-1库存管理系统

【案例介绍】 1.任务描述 像商城和超市这样的地方&#xff0c;都需要有自己的库房&#xff0c;并且库房商品的库存变化有专人记录&#xff0c;这样才能保证商城和超市正常运转。 本例要求编写一个程序&#xff0c;模拟库存管理系统。该系统主要包括系统首页、商品入库、商品显示…

【嵌入式Linux】Linux设备树详解

设备树是是Linux中一种用于描述硬件配置的数据结构&#xff0c;它在系统启动时提供给内核&#xff0c;以便内核能够识别和配置硬件资源。设备树在嵌入式Linux系统中尤其重要&#xff0c;因为这些系统通常不具备标准的硬件配置&#xff0c;需要根据实际的硬件配置来动态配置内核…

逻辑卷建立

逻辑卷 lvm逻辑卷即为&#xff1a;logical volume manager逻辑管理卷&#xff0c;是linux系统下管理硬盘分区的一种机制&#xff0c;lvm适合于管理大型存储文件&#xff0c;用户可以动态的对磁盘进行扩容 作用 lvm&#xff1a;linux系统的一个重要的存储技术 不同的硬盘的不…

【持续更新】【NLP项目】【自然语言处理】智能聊天机器人——“有问必答”【Chatbot】第2章、《模式一:问候模式》

智能聊天机器人——“有问必答” 【注】该项目已开源&#xff0c;开源地址为&#xff1a;链接&#xff0c;代码更新可能不及时。 第2章、《模式一&#xff1a;问候模式》 主窗体的布局如下图所示&#xff1a; 共九种功能模式&#xff0c;最下方为关闭窗口按钮。 点击问候模…

时序预测 | Matlab基于TSA-LSTM-Attention被囊群优化算法优化长短期记忆网络融合注意力机制多变量多步时间序列预测

时序预测 | Matlab基于TSA-LSTM-Attention多变量多步预测 目录 时序预测 | Matlab基于TSA-LSTM-Attention多变量多步预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 时序预测 | Matlab基于TSA-LSTM-Attention被囊群优化算法优化长短期记忆网络融合注意力机制多变量多…

attributeerror: ‘FreeTypeFont‘ object has no attribute ‘getsize‘问题

我在训练yolov9的时候报错&#xff1a;attributeerror: ‘FreeTypeFont‘ object has no attribute ‘getsize‘。看过很多博客分析&#xff0c;都是说FreeTypeFont 字体的原因&#xff0c;其实真实问题出现yolo版本安装的Pillow库更新后&#xff0c;getsize&#xff08;&#…

三维天地:数字技术推动汽车产业实验室管理变革创新

近日,2024汽车技术与装备发展论坛在苏州成功召开。论坛以“共筑汽车产业新质生产力”为主题,聚焦新技术、新装备、新生态展开深入研讨,探索装备制造与汽车产业的融合发展路径。北京三维天地科技股份有限公司受邀参会。 在同期举办的检测认证高质量发展论坛上,三维天地咨询总监宫…

产品人必读书籍丨这本书告诉了我在AI时代如何成为一名顶级PM!!

《人工智能产品经理》——AI时代的PM修炼手册&#xff0c;这是一本不太工具的工具书。 很多人不了解产品经理需要具备的能力和素质。那么产品经理人工智能呢&#xff1f;这就更懵了&#xff0c;全是新词汇组成的新职业&#xff0c;到底怎样才算合格的人工智能产品经理&#x…

免费文件夹加密工具

1、去掉了miniExcel引用包&#xff0c;删除掉了excel配置文件 2、增加了密码登录功能&#xff0c;可以修改密码 3、使用sqlite3数据库来保存文件夹列表和用户密码&#xff0c;用户密码采用md5加盐 4、使用了 antdui来美化下界面 5、未解锁文件平不能被移除 其他还是保持老样…

第四届计算机图形学、人工智能与数据处理国际学术会议

在线投稿&#xff1a;学术会议-学术交流征稿-学术会议在线-艾思科蓝 第四届计算机图形学、人工智能与数据处理国际学术会议&#xff08;ICCAID 2024&#xff09;将于 2024年12月13日-15日在中国南昌举行。本次会议主要围绕“计算机图形学、人工智能与数据处理”的最新研究…

辐射发射测试新境界:深入解析TS-RadiMation套件多种操作方法(一)

TS-RadiMation套件作为辐射发射测试的得力助手&#xff0c;支持多种测试方法。 多频段手动模式电波暗室固定高度测试GTEM小室测试手动模式&#xff08;单频段&#xff09; 本文将详细介绍如何操作手动模式及手动模式&#xff08;单频段&#xff09;这两种模式&#xff0c;助您…

基于matlab的基于Tent混沌映射改进的麻雀搜索算法SSA优化BP神经网络预测

基于Tent混沌映射改进的麻雀搜索算法SSA优化BP神经网络预测 1 普通BP网络 代码如有需要&#xff0c;联系 596520206 %构建网络netnewff(inputn,outputn,hiddennum);% 网络参数net.trainParam.epochs100; % 训练次数net.trainParam.lr0.01; % 学习速…

[前端][基础]JavaScript

1&#xff0c;JavaScript简介 JavaScript 是一门跨平台、面向对象的脚本语言&#xff0c;而Java语言也是跨平台的、面向对象的语言&#xff0c;只不过Java是编译语言&#xff0c;是需要编译成字节码文件才能运行的&#xff1b;JavaScript是脚本语言&#xff0c;不需要编译&…

10:00面试,10:08就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到8月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…