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

news2025/1/18 20:19:12

枚举、指针、结构体,我愿称为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.coloradmin.cn/o/1894774.html

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

相关文章

【病毒分析】假冒游戏陷阱:揭秘MBRlock勒索病毒及其修复方法

1.背景 在公众号文章中看到一篇名为《敲竹杠木马分析:虚假的植物大战僵尸杂交版》的文章,样本来源于某吧,对此我们对样本进行了提取分析。 文章链接:https://mp.weixin.qq.com/s/Up9u4DZtHnVNMiGBIHZzHw 2.恶意文件基础信息 文…

鸿蒙开发设备管理:【@ohos.update (升级)】

升级 说明: 本模块首批接口从API version 6开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档:gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 升级范围&…

Build a Large Language Model (From Scratch)附录B(gpt-4o翻译版)

来源:https://github.com/rasbt/LLMs-from-scratch?tabreadme-ov-file https://www.manning.com/books/build-a-large-language-model-from-scratch

上海-灵曼科技(面经)

上海-灵曼科技 hr电话面 个人简介 个人信息的询问 是否知道芋道框架 技术面 算法题 14. 最长公共前缀(写出来即可) 聊一下Docker Docker核心概念总结Docker实战 聊一下AOP Spring AOP详解 聊一下JWT JWT 基础概念详解JWT 身份认证优缺点分析 Spri…

智能猫砂盆到底哪家好用?自费实测聚宠、糯雪、CEWEY真实反馈!

快到夏天了,是不是还有人因为没挑选到喜欢的智能猫砂盆而苦恼着?太便宜怕不好用,太贵怕质量比不上价格。来来去去拖到现在还没决定,我作为养了四年猫的资深铲屎官,今天就来给大家传授经验,关于我是怎么从好…

记录通过Cloudflare部署属于自己的docker镜像源

引言 由于最近国内无法正常拉取docker镜像,然而找了几个能用的docker镜像源发现拉取回来的docker镜像不是最新的版本,部署到Cloudflare里Workers 和 Pages,拉取docker 镜像成功,故记录部署过程。 部署服务 登录Cloudflare后&…

Xilinx FPGA:vivado关于RAM的一些零碎的小知识

一、xilinx fpga嵌入式存储单元 RAM----随机存取存储器:上电工作时可以随时从任何一个指定的地址写入(存入)或读出(取出)信息。缺点是一旦断电所存储的数据将随之丢失。RAM在计算机和数字系统中用来暂时性存储程序、数…

openlayers中区域掩膜的实现

概述 在前文完成了mapboxGL中区域掩膜的实现。近日有人问到说在openlayers中如何实现,本文就带大家看看如何在openlayers中实现区域掩膜。 实现效果 实现 1. 实现思路 在地图容器中添加一个canvas,设置其在map之上;监听map的postrender事…

1-认识网络爬虫

1.什么是网络爬虫 ​ 网络爬虫(Web Crawler)又称网络蜘蛛、网络机器人,它是一种按照一定规则,自动浏览万维网的程序或脚本。通俗地讲,网络爬虫就是一个模拟真人浏览万维网行为的程序,这个程序可以代替真人…

在虚拟仿真中学习人工智能,可以达到什么目标?

人工智能已经成为引领社会创新的关键力量,想要在这个充满机遇的领域中脱颖而出,掌握扎实的专业技能和积累丰富的实践经验至关重要。然而,许多学习者在追求这一目标的过程中面临着几个主要问题:专业技术掌握有难度、实践经验积累存…

【算法训练记录——Day41】

Day41——动态规划Ⅲ 1.理论基础——代码随想录2.纯01背包_[kamacoder46](https://kamacoder.com/problempage.php?pid1046)3.leetcode_416分割等和子集 背包!! 1.理论基础——代码随想录 主要掌握01背包和完全背包 物品数量: 只有一个 ——…

(十三)MipMap

MipMap概念 滤波 采样 mipmap级别判定 问题:opengl如何判定应该使用下一级的mipmap呢? 通过glsl中的求偏导函数计算变化量决定 手动实现mipmap原理 1、生成mipmap的各个级别 2、修改vertexShader使得三角形随着时间变小 **** 需要更改Filter才能…

如何在操作使用ufw设置防火墙

UFW(简单防火墙)是用于管理iptables防火墙规则的用户友好型前端。它的主要目标是使iptables的管理更容易。 在学习Linux的时候大家一般都会关心命令,Posix API和桌面等,很少会去了解防护墙。其实除了一些网络安全厂商提供的付费防…

Zabbix 配置MySQL数据库监控

Zabbix MySQL数据库监控简介 通过 Zabbix 监控 MySQL 数据库,可以获取有关数据库性能、运行状况和资源使用情况的详细信息,帮助及时发现和解决问题。 Zabbix官方提供了一个名为MySQL by Zabbix agent的监控模板,该模板专为 Zabbix 通过 Zabb…

波动方程 - 在三维图中动态显示二维波动方程的解就像水面波澜起伏

波动方程 - 在三维图中动态显示二维波动方程的解就像水面波澜起伏 flyfish 波动方程的求解结果通常不是一个单一的数值,而是一个函数或一组函数,这些函数描述了波随时间和空间的传播情况。具体来说,波动方程的解可以是关于时间和空间变量的…

技术驱动旅游创新!深度解析景区导览小程序的地图渲染与AR导航技术

随着现代生活节奏的加快,人们在外出旅游时更倾向于轻便出行,携带导览地图已成为过去。然而,面对景区广阔的面积和众多景点,游客常常感到迷茫,难以快速定位到自己所需的地点。景区导览小程序让游客只需搜索景区名称&…

PyQT: 开发一款ROI绘制小程序

在一些基于图像或者视频流的应用中,比如电子围栏/客流统计等,我们需要手动绘制一些感兴趣(Region of Interest,简称ROI)区域。 在这里,我们基于Python和PyQt5框架开发了一款桌面应用程序,允许用…

谷粒商城学习笔记-05-项目微服务划分图

文章目录 一,商城业务服务-前端服务二,商城业务服务-后端服务三,存储服务四,第三方服务五,服务治理六,日志七,监控预警系统1,Prometheus2,Grafana3,Prometheu…

TSINGSEE智能分析网关V4人员区域徘徊AI检测:算法原理介绍及技术应用场景

一、引言 在现代社会,随着科技的不断发展,视频监控系统已广泛应用于各个领域,如公共安全、商业管理、交通监控等。其中,区域徘徊检测算法作为一种重要的视频分析技术,能够有效地识别出特定区域内人员的徘徊行为&#…

LLMs之gpt_academic:gpt_academic的简介、安装和使用方法、案例应用之详细攻略

LLMs之gpt_academic:gpt_academic的简介、安装和使用方法、案例应用之详细攻略 目录 gpt_academic的简介 1、版本更新历史 版本: 1、新增功能及其描述 新界面(修改config.py中的LAYOUT选项即可实现“左右布局”和“上下布局”的切换) 所…