【C进阶】同事用void把我给秀翻了!

2023-05-16

2、简单认识一下void

今天跟大家介绍的知识是C语言中的void关键字的用法,void在大部分小伙伴的程序中都只是用于函数无参数传入,或者无类型返回。

然而我们平时所定义的变量都会有具体的类型,int,float,char等等,那是否有void类型的变量呢?大家可以动手实验一下,答案是:不行,编译会出错。

图片

上图很明显编译器不允许定义void类型的变量,变量都是需要占用一定内存的,既然void表示无类型,编译器自然也就不知道该为其分配多大的内存,于是造成编译失败。

虽然void不能直接修饰变量,但是其可以用于修饰指针的指向即无类型指针void*,无类型指针那就有意义了,无类型指针不是一定要指向无类型数据,而是可以指向任意类型的数据。

3、void * 基本操作

大家其实在使用动态内存分配的使用就已经遇到了void *的使用,来我们一起看看如下几个标准函数的原型定义:

图片

上面这些函数都是与内存操作有关的函数,可能一些小伙伴使用过也不一定知道每个参数的具体类型是什么,这些void*部分的形参所传入的实参都是不需要进行强制类型转化的,所以根本就不需要关注传入指针所指向的具体类型,然而函数所返回的void 一般都需要通过强制类型转化为对应的具体类型,除非你最后所传递的变量也是void类型。

参考void*用法:

 1#include <stdio.h>
 2#include <stdlib.h>
 3#include <malloc.h> 
 4
 5#define NUM 10
 6/*************************************
 7 * Fuction:了解一下void*的使用 
 8 * Author : (公众号:最后一个bug) 
 9 *************************************/
10int main(int argc, char *argv[]) {
11    int *p1 = (int *)malloc(NUM*sizeof(int)); 
12    int *p2 = (int *)malloc(NUM*sizeof(int)); 
13    int  i = 0;
14
15    //初始化p1 
16    for(i = 0;i < NUM;i++) 
17    {
18        *(p1+i) = i;
19    }
20    //进行内存copy 
21    memcpy(p2,p1,NUM*sizeof(int));
22
23    //输出另外一个分配的内存 
24    for(i = 0;i < NUM;i++) 
25    {
26       printf("%d,",*(p2+i)); 
27    }   
28    //释放内存 
29    free(p1);
30    free(p2);
31    return 0;
32}

运行结果:

图片

4、使用void * 实现无类型数据封装

为了保持文章的完整性,也许这里才是作者最想跟大家介绍的,void*既然如此的灵活一定大有用处,如果仅仅只是用来简单的传递参数似乎有点大材小用,我们得把其用到上层的软件设计上来。

在一些项目中经常看到有小伙伴把数据类型转来转去,甚至有时候为了一个数据类型的变化还得重新写一个仅仅数据类型不同的函数,这样的代码上万行代码指日可待,按下面我们以一个例子来跟大家介绍一种办法能够减少数据类型变化所带来的程序重复代码的增加。

参考实例:

 1#include <stdio.h>
 2#include <stdlib.h>
 3/********************************** 
 4 * Fuction : add
 5 * descir :  加法的相关数据及处理办法 
 6 * Author : (公众号:最后一个bug)
 7 **********************************/ 
 8typedef struct _tag_Add
 9{
10    int a;
11    int b;
12    int result;
13}sAdd;
14
15void Add(void *param)
16{
17    sAdd *p = (sAdd *) param;
18    p->result = p->a + p->b;
19}
20/********************************** 
21 * Fuction : add
22 * descir :  乘法的相关数据及处理办法 
23 * Author : (公众号:最后一个bug)
24 **********************************/ 
25typedef struct _tag_Mul
26{
27    float a;
28    float b;
29    float result;
30}sMul;
31
32void Mul(void *param)
33{
34    sMul *p = (sMul *) param;
35    p->result = p->a * p->b;
36}
37
38/************************************* 
39 * Fuction : sCal
40 * descir :  公共的调用接口 
41 * Author : (公众号:最后一个bug)
42 ************************************/ 
43void sCal(void *param,void *fuc)
44{
45    ((void (*)(void*))fuc)(param);
46}
47
48/********************************** 
49 * Fuction : main
50 * descir : 应用接口实例 
51 * Author : (公众号:最后一个bug)
52 **********************************/  
53int main(void)
54{
55    sAdd stAdd;
56    sMul stMul;
57
58    //数据初始化 
59    stAdd.a = 10;
60    stAdd.b = 20;
61
62    stMul.a = 5;
63    stMul.b = 5;
64    //接口直接用 
65    sCal(&stAdd,Add);
66    sCal(&stMul,Mul);
67    //对应的输出 
68    printf("a + b = %d\n",stAdd.result);
69    printf("a * b = %f\n",stMul.result);
70    printf("公众号:最后一个bug\n");
71    return 0;
72 } 

运行结果:

图片

分析一下:

上面的例子可能还是无法完全彰显void*的强悍之处了,不过其主要的作用就是为了隐藏数据类型,大家也可以理解为一种数据类型的抽象处理,这也是面向对象编程的一种体现。

4、最后小结

对于void这个关键字的使用bug菌就先讲这么多吧!大家一定要记得对于一些编程技巧一定要尝试着去使用,可能达到项目目标的方式有很多种,但是一些好的设计不仅仅会让你的代码增色不少,同时也会让同事们觉得你是一个喜欢专研技术的人。

https://mp.weixin.qq.com/s/Wo98P0rlHReEbtfHz5jXtQ

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【C进阶】同事用void把我给秀翻了! 的相关文章

  • FreeRTOS学习(一)

    裸机与RTOS对比 裸机 xff1a 又称为前后台系统 xff0c 前台系统指的是中断服务函数 xff0c 后台系统指的大循环 xff0c 即应用程序 实时性差 xff1a xff08 应用程序轮流执行 xff09 delay xff1a
  • 如何画架构图?

    在我们做系统架构设计时 xff0c 如何快速的向外界传达我们的设计思路 4 43 1试图适合我们厘清思路 表达自己的想法 在我们汇报 xff0c 争取领导层的认同支持更适合用架构图来表述我们的观点 架构图包括总体架构 逻辑架构 应用架构 技
  • 怎么做串口调试软件?

    嗯 说一下我自己写的串口助手吧 xff0c 名字叫 Bittly xff0c 样子呢长下面这个样子 Bittly 指令调试界面 1 需求确认 一开始使用的是类似于XCOM或者SSCOM之类的串口调试助手 xff0c 他们的优点是体积小 xf
  • 【需求专题】如何写好需求——INCOSE需求编写指南(1)

    已剪辑自 https mp weixin qq com s Z5VBTyV6j07JylDdOsFSxQ 编者按 如何写好需求是INCOSE 需求工作组编写的需求文本化表达指南 本指南是专门讲述如何在系统工程中对需求进行文本化表达 xff0
  • 怎么提高自己的系统设计和架构理论水平?

    文章目录 前言 1 无锁化 1 1 串行无锁 1 2 结构无锁 2 零拷贝 2 1 内存映射 2 2 零拷贝 3 序列化 3 1 分类 3 2 性能指标 3 3 选型考量 4 池子化 4 1 内存池 4 2 线程池 4 3 连接池 4 4
  • 30+男生程序员中年如何破局

    已剪辑自 https zhuanlan zhihu com p 596751971 1 最顶级的程序员根据自己的经验拼paper 拼专利 xff0c 成为不可替代的专家 最厉害的程序员拼的不是代码写的多牛逼 而是有多少paper多少顶尖专利
  • 为啥AI难落地?

    总在说AI落地难 xff0c 那为啥难落地 xff1f 以最典型的智慧城市业务来说 xff0c 就是接入网络摄像头 xff0c 然后识别里面的人 xff0c 判断是不是抽烟 打架 闯红灯 不带安全帽等 首先是连接网络摄像机 xff0c GB
  • 搞技术,如何写好技术文档?

    已剪辑自 https mp weixin qq com s OtSwtMyeifoc7ED35a vEA 嵌入式方案设计文档 xff0c 到底应该怎么写 xff1f 你是不是从来没有想过这个问题 xff1f 很多技术人自己非常轻视技术文档的
  • 用125行C语言编写一个简单的16位虚拟机

    已剪辑自 https mp weixin qq com s ikrpGtssoKpumHXhrQdh8Q 博文地址 xff1a 改博文用图文代码的方式详细描述了实现的具体过程 xff0c 包含每一条指令的含义 系统虚拟机 xff0c 可完全
  • RT-Thread操作系统的FreeRTOS兼容层

    已剪辑自 https mp weixin qq com s 2BjJyieMr97NQhO76DQ3hw Github地址 https github com RT Thread packages FreeRTOS Wrapper 本项目是2
  • 嵌入式开发既要代码小,又想速度快,该如何优化?

    已剪辑自 https mp weixin qq com s HaoPN0upS8OEheXpSHWBFA 素材来源 xff1a 网络素材 整理 xff1a 技术让梦想更伟大 李肖遥 对程序进行优化 xff0c 通常是指优化程序代码或程序执行
  • 小白学C语言编程(for语句无限制循环)

    问题 xff1a 怎么样无限制输出一个比1大的数 xff1f span class token macro property span class token directive keyword include span span clas
  • 嵌入式开发打印,我放弃了printf

    已剪辑自 https mp weixin qq com s GGZ38dUITlS6w9hnMbzsvg 对于printf xff0c 相信不用我过多介绍 xff0c 大家在初学C语言时用得最多的信息输出接口函数应该就是printf了 对于
  • 自动驾仿真测试平台干货内容梳理

    已剪辑自 https mp weixin qq com s Ftv2rgiGW6FGVQgMz4A9PQ 1 自动驾驶仿真平台的关键构成 自动驾驶仿真平台需支持车辆动力学仿真 环境感知传感器仿真 交通场景仿真等 xff1b 车辆动力学仿真
  • 自动驾驶域控制器开发和量产的挑战

    已剪辑自 https mp weixin qq com s Sh4ONJxrmvDbfWlcDnXYtQ 过去十多年的汽车智能化和信息化发展产生了一个显著结果就是ECU芯片使用量越来越多 从传统的引擎控制系统 安全气囊 防抱死系统 电动助力
  • STM32属于哈佛结构还是冯诺依曼结构?

    现代的CPU基本上归为冯诺伊曼结构 xff08 也称普林斯顿结构 xff09 和哈佛结构 我们常见的X86架构是冯 诺依曼结构 xff0c 而ARM架构是哈佛结构 一个广泛用于桌面端 xff08 台式 笔记本 服务器 工作站等 xff09
  • 2022年度复盘和2023年目标:在焦虑中探索,在体验中成长,在开放中升华

    文章目录 2022年度复盘工作 xff1a 焦虑 xff0c 认知 xff0c 提升个人工作 xff1a 工作态度需要提升团队工作 xff1a 尊重 真诚 准确清晰完善感悟 个人成长硬能力 xff1a 学习 博客软能力 xff1a 知乎 B
  • 技术部门Leader是不是一定要技术大牛担任?

    现在在腾讯做技术Leader xff0c 之前在阿里 xff0c 绿厂也带过技术团队 xff0c 每家的情况有共同点也有区别 现在总结下来 xff0c 除去特别通用的技术 责任心 沟通 主动性这些 xff0c 作为Leader很关键的个人素
  • 一个人该怎样找到自己真正热爱和擅长的事,并以此规划自己的人生?

    文章目录 一个人该怎样找到自己真正热爱和擅长的事 xff0c 并以此规划自己的人生 xff1f 一 有关擅长的4个错误认知 二 做好这3步 xff0c 拥有擅长之事 1 生成兴趣清单 2 缩小选择范围 3 练练看 三 写在最后 下面这张图
  • 一个适用于单片机的开源网络协议栈

    已剪辑自 https mp weixin qq com s Vpi4E9T5BUo cdCE692V A 移植及使用说明 协议栈支持主流的ARM Cortex系列MCU xff0c 支持Keil MDK IAR等常见IDE 移植的核心工作就

随机推荐

  • 嵌入式软件分层隔离的典范

    已剪辑自 https mp weixin qq com s T7EJEAuXo1CCJa5vPAPVvg 引言 xff1a 嵌入式软件开发分层 模块化是理想状态 xff0c 实际开发中因各种限制而有所取舍 xff0c 但这不妨碍学习参考优秀
  • 软件定时器库

    前后台系统和多任务操作系统 xff0c 在简单功能上差别不大 xff0c 唯一不顺手的就是前后台系统没有合适的软件定时器 封装一层软件定时器接口 xff0c 对后续功能开发事半功倍 定义结构体数组 xff0c 其基础成员如下 xff1a s
  • 解决Raspberry系统ssh默认关闭的问题

    问题描述 xff1a 最近 xff0c 自己动手给树莓派3B安装了一个最新的系统 xff0c 本想通过SSH远程登录系统的时候 xff0c 发现登录不了 xff0c 具体表现为能ping通 xff0c 但是Xshell就是连不上 xff0c
  • mbedtls 库基础及其应用

    文章目录 1 引言1 1 为什么要加密1 2 SSL TLS协议的历史 2 SSL TLS演化2 1 明文时代2 2 对称加密时代2 3 非对称加密时代2 4 公证时代2 5 TLS协议时代2 6 TLS的应用 3 mbedtls3 1 软
  • 动态内存管理及防御性编程

    概述 xff1a C语言的优势是可以直接访问内存地址 xff0c 也就是指针操作 xff0c 但其缺陷也是因为直接内存访问 如何通过防御性编程提前发现问题 xff0c 尽可能减少内存异常产生的后果 xff0c 就是本文的重点 1 内存划分
  • 基于RTOS的软件开发理论

    文章目录 1 RTOS的特点2 任务设计2 1 任务的特性2 2 任务划分的方法2 2 1 设备依赖性任务2 2 2 关键任务2 2 3 紧迫任务2 2 4 数据处理任务2 2 5 触发条件相同的任务2 2 6 运行周期相同的任务2 2 7
  • 面向对象类之间主要的几种关系

    已剪辑自 https mp weixin qq com s ClBuraVUIPhnWceI7m78Xg 嵌入式开发虽然平时C语言用的比较多 xff0c 但面向对象的思维应该是每一位嵌入式软件工程师必备的知识 之前给大家分享过用C语言实现面
  • 世界上最健康的程序员作息表!

    文章目录 7 307 30 8 008 00 8 308 30 9 009 3010 3011 0013 0014 30 15 3016 0017 00 19 0019 3021 4523 0023 30时间 健康的小常识 已剪辑自 htt
  • 30岁了,冒死说几句大实话!

    已剪辑自 https mp weixin qq com s j0yzonrhPPcemDRF6QBVkw 是的 xff0c 我 30 岁了 xff0c 还是周岁 就在这上个周末 xff0c 我度过了自己 30 岁的生日 都说三十而立 xff
  • QT使用QAxObject读取Excel教程-全网最全

    文章目录 一 背景二 介绍基本操作方法获取对象调用动态方法设置和获取属性更多相关 三 使用要求添加模块与excel com连接的方法Excel基本操作 四 具体使用说明五 项目实战实战项目1实战项目2实战项目3实战项目4实战项目5 封装好的
  • 超越内卷-认知差、信息差、时间差

    已剪辑自 https mp weixin qq com s 9pzMQJJnp9ZbkTCVe ao7w 内卷的话题曾经聊过 xff0c 当大家的努力都上不了层次 xff0c 只是原水平重复竞争 xff0c 那么内卷就开始了 最近对这个问题
  • 数十种嵌入式 C 语言代码优化的经验和方法

    文章目录 简介声明哪里需要使用这些方法 xff1f 整形数除法和取余数合并除法和取余数通过2的幂次进行除法和取余数取模的一种替代方法使用数组下标全局变量使用别名变量的生命周期分割变量类型局部变量指针指针链条件执行布尔表达式和范围检查布尔表达
  • 汽车电子国际标准现状与趋势

    已剪辑自 https mp weixin qq com s vLgnrFPtDPglwde1TZUHSQ 在汽车电子系统发展的早期 xff0c 汽车电子基础软件是没有统一标准的 xff0c 各个 OEM Tier1 Tier2 等厂商针对不
  • Linux多线程服务器编程(陈硕)学习总结

    这本书确实是学习多核时代采用现代C 43 43 编写多线程程序的好书 xff0c 下面是学习总结 xff1a 第一章 线程安全的对象生命期管理 对象的创建很简单 xff0c 但是不要在构造期间泄漏this指针 xff0c 比如不要在构造函数
  • 详解 Modbus 通信协议(清晰易懂)

    文章目录 已剪辑自 https mp weixin qq com s dvo1l1GgJ2DtIHnPK5E1tA 本文总结关于 Modbus 相关的知识 xff0c 浅显易懂 xff0c 旨在对 Modbus 有一个很直观的了解 如有错误
  • RTOS应用中的几种调度策略

    从前后台架构的软件开发过渡到使用实时操作系统 RTOS 可能是一项困难的工作 但使用RTOS有许多优势 xff0c 例如简化应用集成 xff0c 支持任务抢占调度 xff0c 当开发人员使用复杂的32位微控制器 xff0c 且可以获取足够的
  • 几款非常棒的使用文本来进行图形化注释的工具

    https mp weixin qq com s NX8feH UPE7oegM7U9W4GA 说明 xff1a 1 程序代码里面非常好的注释方式 2 相关网站 xff1a xff08 1 xff09 https metacpan org
  • 解决Excel打开UTF-8编码CSV文件乱码的问题

    最近在用QT读写CSV文件 xff0c 发现将数据写入到CSV文件中 xff0c 使用记事本打开文件是正常的 xff0c 使用Excel打开 xff0c 中文是乱码的 xff0c 下面把原因和解决方法记录一下 问题产生的原因 为什么exce
  • Windows下查看端口占用情况

    编程的时候经常发现我们需要使用的端口被别的程序占用 xff0c 这个时候需要清楚查看是哪个程序占用了端口 xff0c 用且清除了这个进程 xff01 1 开始 gt 运行 gt cmd xff0c 或者是window 43 R组合键 xff
  • 【C进阶】同事用void把我给秀翻了!

    2 简单认识一下void 今天跟大家介绍的知识是C语言中的void关键字的用法 xff0c void在大部分小伙伴的程序中都只是用于函数无参数传入 xff0c 或者无类型返回 然而我们平时所定义的变量都会有具体的类型 xff0c int x