单片机软件架构连载(4)-结构体

枚举、指针、结构体,我愿称为C语言"三板斧"。

用人话来讲,几乎所有c语言高阶编程,都离不开这这3个知识点的应用。

今天站在实际产品常用的角度,给大家讲一下结构体。

1.结构体概念

结构体可以用来构建更复杂的数据结构,如队列、链表等。

在C语言,数据类型有char、short、int...等,还有可以通过数组来构造同类型数据的集合,比如说unsigned char buff[10]。

但这种数据集合,只能是同一种类型的数据。

在我们产品开发时,通常有很多需要不同数据类型组合的数据结构,比如像学生信息,包含姓名,年龄,成绩等信息。

不同的信息,可能会涉及不同的数据类型,比如数组,字符,整型....

我们希望把这些信息,能够封装起来,形成一个新的数据结构,比如学生信息数据结构,这样工程师在对这些数据处理时,会更方便,否则身份信息一多,容易乱,基于这种需求,就有了结构体

所以,结构体(Structure)在C语言中是一种复合数据类型,它能将相关但不同类型的数据,组合成一个新的数据类型/结构。

结构体是面向对象编程中类的基础,尽管C语言本身不是面向对象的,但结构体提供了一种模拟面向对象特性的方式。

比如"学生"是对象,我们把这个对象共有的数据信息(姓名、年龄、成绩)封装起来,构建这个对象的数据类型。

2.结构体常用的定义和访问

2.1定义结构体类型

语法如下:

这里的结构体名是你自定义的名称,用于之后引用这个结构体类型。 示例代码:

每个类型后面跟着的是结构体中的成员变量,它们可以是基本数据类型,如char、short、int、float等,也可以是其他结构体类型,比如指针,结构体类型。

2.2 定义和初始化结构体变量

定义好结构体类型后,我们就可以用该类型,去定义一个结构体变量,并初始化其成员值了。 示例代码:

创建Student类型的结构体变量stu1,并初始化,名字为 ZhangSan,年龄 20,成绩 92.5。

2.3 结构体成员的访问

结构体的每个成员都可以通过点(.)操作符来访问。格式如下:

这里变量名是结构体变量的名称,成员名是结构体中定义的成员变量的名称。 示例代码:

代码结果输出:

2.4 用typedef 定义结构体类型

还有一种方式,也是产品开发很常用的,就是用typedef去定义结构体类型。

这段代码使用typedef关键字,在定义结构体的同时创建了一个新的类型别名Student。

这样做的好处是,你可以在程序的其他地方,直接使用Student来定义结构体变量,而不需要每次都写出完整的结构体定义。 例如:

这种方式,代码更加简洁和易于阅读,实际产品开发用的很多很多。

3.结构体数组

结构体数组是将结构体变量存储在一个数组中,这样可以同时处理多个具有相同结构体类型的数据。

以下是结构体数组的定义和使用的基本步骤:

3.1 定义结构体数组

3.2 初始化结构体数组

可以在定义数组的同时初始化它,为每个元素的成员赋值。

3.3 使用结构体数组

使用结构体数组时,可以通过索引来访问和修改数组中的元素。 下是完整的示例代码,演示如何定义结构体数组、初始化以及使用它。

代码输出结果:

我们定义了一个Student结构体类型,然后创建了一个包含2个元素的students数组,并为数组里的元素进行初始化。

最后用for循环来遍历数组并打印每个学生的信息。

可以发现,使用结构体数组,可以方便地管理和操作具有相同属性的多个数据项。

4.结构体指针

指针与结构体在C语言中是紧密相关的,因为结构体经常通过指针来操作,以提高程序的效率和灵活性。 我们无际单片机特训营的项目3,用结构体指针做了链表和防盗报警模式的切换。 结构体指针,就是指向结构体的指针变量,存储着结构体变量在内存中的地址。

4.1 定义结构体指针

4.2 初始化结构体指针

4.3 使用结构体指针

以上代码演示了,通过结构体指针,我们可以间接访问和修改结构体变量的成员。 代码输出结果:

5.嵌套结构体

嵌套结构体,就像它的名字一样,指的是一个结构体里面包含了另一个结构体。

这就像是一个大箱子里装了一个小箱子,小箱子里还可以装东西。

在现实世界中,很多数据都是有层次关系的。比如,一个学校有多个班级,每个班级有多个学生。

那使用嵌套结构体,就可以很好地在计算机世界,模拟这种层次关系,使得复杂的数据关系,变得更加清晰。

5.1 定义嵌套结构体

定义嵌套结构体,其实就是在一个大结构体的定义中包含一个小结构体。

这里是一个简单的例子:

Student结构体中的bestCourse成员是一个Course类型的结构体,这就是嵌套结构体。

5.2初始化和使用嵌套结构体

代码输出结果:

6.结构体产品应用

6.1硬件抽象化

结构体能以一种与硬件无关的方式来编写代码。

比如定义各种硬件配置参数,如GPIO配置、定时器设置等。

这样做有什么优势? 可以兼容在不同的硬件上运行,大大提高了代码的可移植性。

通过提供一系列标准化的函数或方法来简化对硬件的操作。开发者无需深入了解硬件的具体细节,就可以实现对硬件的控制。

STM32的库就是一个很典型的例子,一个库能兼容同一系列所有MCU。

6.2 产品的系统参数

比如说一些需要掉电保存的数据。

结构体可以将相关的数据项组合在一起,形成数据封装,方便后续EEPROM的读写操作,也有助于提高代码的可读性和可维护性。

6.3 复杂的数据结构

比如无际单片机特训营的项目,通过结构体做队列,任务管理,链表等数据结构。

如果说指针是C语言的灵魂,那么结构体可以被视为C语言的“骨架”,是组织和操作复杂数据类型的重要工具,它为数据的封装、抽象和操作提供了强大的支持,是构建高效、可维护和可扩展程序的基础。


最近很多粉丝问我单片机怎么学,我根据自己从业十年经验,累积耗时一个月,精心整理一份「单

片机最佳学习路径+单片机入门到高级教程+工具包」全部无偿分享给铁粉!!!

除此以外,再含泪分享我压箱底的22个热门开源项目,包含源码+原理图+PCB+说明文档,让你迅速进阶成高手

教程资料包和详细的学习路径可以看我下面这篇文章的开头

《单片机入门到高级开挂学习路径(附教程+工具)》

《单片机入门到高级开挂学习路径(附教程+工具)》

《单片机入门到高级开挂学习路径(附教程+工具)》

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Rust入门实战 编写Minecraft启动器#3解析资源配置

首发于Enaium的个人博客 在上一篇文章中,我们已经建立了资源模型,接下来我们需要解析游戏的配置文件。 首先我们添加serde_json依赖和model依赖。 model { path "../model" } serde_json "1.0"之后我们在lib.rs中添加解析的tra…

用户画像与相关性分析揭示麦当劳满意度提升关键

1.项目背景 在当今的餐饮行业中,顾客满意度已成为衡量服务质量和市场竞争力的关键指标,准确了解并提升顾客满意度,对于麦当劳制定有效的营销策略和优化产品服务至关重要。通过深入分析影响顾客满意度的主要因素,可以帮助麦当劳更好地理解顾客行为,从而制定更有针对性的策…

springmvc前端jsp与html

在Spring MVC框架中,前端页面既可以使用JSP(JavaServer Pages)也可以使用HTML,具体使用哪一种或哪几种技术,主要取决于项目的需求、团队的熟悉度以及项目的可维护性等因素。下面分别介绍这两种技术的使用场景和优缺点&…

中霖教育怎么样?二建继续教育什么意思?

1. 为什么要继续教育? 根据现行规定,二级建设师在获取资格证书后,若时间超过三年无论是否已进行注册,均需参加继续教育。此举旨在确保专业技术人员能够不断更新和补充其专业知识与技能,进而提升其创新能力、创造能力以及专业技术…

事件mousePressEvent、paintEvent、closeEvent、keyPressEvent】

事件 mousePressEvent、paintEvent、closeEvent、keyPressEvent 鼠标样式的设置 按WSAD通过keyPressEvent事件移动按钮 通过事件mousePressEvent获取鼠标位置的相对位置,绝对位置 cusor 鼠标样式设置成十字星 .h #ifndef DEFAULTHANDLEREXAMPLE_H #define DEFAUL…

C++ 11 智能指针使用详解

文章目录 C++ 11 智能指针使用详解一、智能指针的介绍1. `std::unique_ptr`2. `std::shared_ptr`3. `std::weak_ptr`二、智能指针的基本使用方法1. 创建和初始化智能指针使用 `std::unique_ptr`:使用 `std::shared_ptr`:2. 访问指针指向的对象使用 `std::unique_ptr`:使用 `…

GANs算法简介、学习步骤及具体实现

生成对抗网络(Generative Adversarial Networks,GANs)自从2014年由Ian Goodfellow等人提出以来,已经成为深度学习领域中最活跃的研究方向之一。GAN的基本思想是利用两个神经网络——生成器(Generator)和判别…

供应MT7628AN芯片现货

长期供应各品牌芯片现货: MT7628AN VC7920-11 QM77043 QM78207 QM77043 SD18-0847R8UUB1 QM78207 QPF4588TR13-5K D5DA782M0K2J6 SAYRH725MBA0B0A QM56023TR13-5K D5DA737M5K2H2 HS8443-61 RF5422 QM56021TR13-5K S55643-11 OM8816-61…

做好私域服务就是赢得用户的心

私域流量的概念在当今的商业环境中已经变得极为重要,许多品牌和企业都投入大量资源尝试通过各种策略吸引并保留用户。然而,单纯的流量积累并不足以确保商业成功。当面对用户的沉默、缺乏活跃度以及无法变现的困境时,我们必须重新审视私域流量…

Perforce发布白皮书,解读电动汽车初创公司如何加速进入市场并降低软件开发中的风险和成本

电动汽车(EV)领域的初创企业正迅速崛起,创新速度显著加快。然而,随着消费者对电动汽车需求的激增,老牌汽车制造商正加速进军这一市场,加剧了行业竞争。为在竞争中生存并发展,电动汽车初创企业必…

硬盘错误0x80071ac3如何修复?5大免费修复法,轻松找回硬盘数据

今天我们要聊的是一个让大家头疼不已的问题——硬盘错误0x80071ac3。你是否也曾经遇到过这个烦人的错误代码,导致数据无法读取、文件丢失,甚至整个硬盘都无法正常使用?别担心今天小编就为大家详细解析这个错误的原因,并分享5个免费…

远程Linux机器图形化界面使用及音频转发

对于一些远程Linux云机器,一般我们在使用时通过各种ssh连接工具连接,并使用命令行方式操作,但是部分需要图形化界面验证的应用,必须需要使用到远程机器的图形化功能,本文记录总结一些跟远程使用Linux机器图形化界面以及…

27_电子电路设计基础

电路设计 电路板的设计 电路板的设计主要分三个步骤:设计电路原理图、生成网络表、设计印制电路板。 (1)设计电路原理图:将元器件按逻辑关系用导线连接起来。设计原理图的元件来源是“原理图库”,除了元件库外还可以由用户自己增加建立新的元件&#…

MySQL8之mysql-community-server的作用

MySQL8之mysql-community-server的作用主要体现在以下几个方面: 1. 提供开源的MySQL数据库服务 mysql-community-server是MySQL的一个开源版本,它是MySQL AB在2000年推出并由Oracle公司维护和管理的一个关系型数据库系统。这个服务器软件支持多种类型的…

WAIC | 2024年世界人工智能大会“数学与人工智能”学术会议成功举办!

由斯梅尔数学与计算研究院(Smale Institue of Mathematics & Computation)主办的2024年世界人工智能大会(WAIC)“数学与人工智能”学术会议7月4日在上海世博中心圆满落幕!作为全球性高级别学术研讨会,此次会议由华院计算技术&…

相机光学(二十八)——感光度(ISO)

感光度又称为ISO,是指相机对光线的敏感程度。ISO值越大,感光度越高,拍出来的照片就会越亮,反之就会越暗。但是ISO过高会使照片噪点也随之变高。感光度,又称为ISO值,是衡量底片对于光的灵敏程度,…

22. Java ReentrantLock 使用

1. 前言 本节内容主要是对 ReentrantLock 的使用进行讲解,之前对于 Lock 接口进行了讲解,ReentrantLock 是 Lock 接口的常用实现子类,占据着十分重要的地位。本节内容的知识点如下: ReentrantLock 基本方法的使用,即 lock 与 unlock 方法的使用,这是最基础的方法使用,为…

Python 修改 pip 源

1.临时换源: #清华源 pip install markdown -i https://pypi.tuna.tsinghua.edu.cn/simple # 阿里源 pip install markdown -i https://mirrors.aliyun.com/pypi/simple/ # 腾讯源 pip install markdown -i http://mirrors.cloud.tencent.com/pypi/simple # 豆瓣源 …

html+js+css练手小项目

文章目录 练手小项目前言1.多轮播图1.1 效果展示1.2 实现思路1.2.1 三张轮播图1.2.2 左侧轮播图 1.2.3 右侧轮播图1.2.4 整体结合 2.图片变色2.1 效果展示2.2 实现 练手小项目 ☀️作者简介:大家好我是言不及行yyds 🐋个人主页:言不及行yyds的…

字节码编程javassist之打印方法耗时和入参

写在前面 本文看下如何实现打印方法耗时和入参。 1:程序 需要增强的类: public class ApiTest1 {public Integer strToInt(String str01, String str02) {return Integer.parseInt(str01);}}插桩类 package com.dahuyou.javassist.huohuo.aa;import…