当前位置: 首页 > news >正文

单片机软件架构连载(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+说明文档,让你迅速进阶成高手

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

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

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

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

相关文章:

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

枚举、指针、结构体,我愿称为C语言"三板斧"。 用人话来讲,几乎所有c语言高阶编程,都离不开这这3个知识点的应用。 今天站在实际产品常用的角度,给大家讲一下结构体。 1.结构体概念 结构体可以用来构建更复杂的数据结…...

工厂方法模式在金融业务中的应用及其框架实现

引言 工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个创建对象的接口,但由子类决定实例化哪一个类。工厂方法模式使得类的实例化延迟到子类。在金融业务中,工厂方法模式可以用于创建不同类型…...

python库(6):Pygments库

1 Pygments介绍 在软件开发和文档编写中,代码的可读性是至关重要的一环。无论是在博客文章、技术文档还是教程中,通过代码高亮可以使程序代码更加清晰和易于理解。而在Python世界中,Pygments库就是这样一个强大的工具,它能够将各…...

金斗云 HKMP智慧商业软件 任意用户创建漏洞复现

0x01 产品简介 金斗云智慧商业软件是一款功能强大、易于使用的智慧管理系统,通过智能化的管理工具,帮助企业实现高效经营、优化流程、降低成本,并提升客户体验。无论是珠宝门店、4S店还是其他零售、服务行业,金斗云都能提供量身定制的解决方案,助力企业实现数字化转型和智…...

前端JS特效第24集:jquery css3实现瀑布流照片墙特效

jquery css3实现瀑布流照片墙特效&#xff0c;先来看看效果&#xff1a; 部分核心的代码如下(全部代码在文章末尾)&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8" /> <title>jquerycss3实现瀑…...

区块链论文速读A会-ISSTA 2023(2/2)如何检测DeFi协议中的价格操纵漏洞

Conference&#xff1a;ACM SIGSOFT International Symposium on Software Testing and Analysis (ISSTA) CCF level&#xff1a;CCF A Categories&#xff1a;Software Engineering/System Software/Programming Languages Year&#xff1a;2023 第1~5篇区块链文章 请点击此…...

权力之望怎么下载客户端 权力之望一键下载

《权力之望》是一款由NX3 Games开发、Smilegate发行的多人在线动作MMORPG游戏。这款游戏最大的特点是高度的自由度和丰富的角色定制选项。我们在游戏中不仅可以自由更换武器&#xff0c;而且游戏还提供了54种能力和60多种职业选择&#xff0c;让我们可以根据自己的游戏风格和喜…...

Oracle PL/SQL 循环批量执行存储过程

1. 查询存储过程 根据数据字典USER_OBJECTS查询出所有存储过程。 2. 动态拼接字符串&#xff08;参数等&#xff09; 根据数据字典USER_ARGUMENTS动态拼接参数。 3. 动态执行 利用EXECUTE IMMEDIATE动态执行无名块。 4. 输出执行信息 利用DBMS_OUTPUT.PUT_LINE输出执行成功与…...

kafka 生产者

生产者 生产者负责创建消息&#xff0c;然后将其投递到Kafka中。 负载均衡 轮询策略。随机策略。按照 key 进行hash。 Kafka 的默认分区策略&#xff1a;如果指定了 key&#xff0c;key 相同的消息会发送到同一个分区&#xff08;分区有序&#xff09;&#xff1b;如果没有…...

Powershell 获取电脑保存的所有wifi密码

一. 知识点 netsh wlan show profiles 用于显示计算机上已保存的无线网络配置文件 Measure-Object 用于统计数量 [PSCustomObject]{ } 用于创建Powershell对象 [math]::Round 四舍五入 Write-Progress 显示进度条 二. 代码 只能获取中文Windows操作系统的wifi密码如果想获取…...

golang结合neo4j实现权限功能设计

neo4j 是非关系型数据库之图形数据库&#xff0c;这里不再赘述。 传统关系数据库基于rbac实现权限, user ---- role ------permission,加上中间表共5张表。 如果再添上部门的概念&#xff1a;用户属于部门&#xff0c;部门拥有 角色&#xff0c;则又多了一层&#xff1a; user-…...

java 参数传递(尤其注意参数是对象的情况)

8大基本数据类型为 值传递 类和数组为 引用传递&#xff0c;传递的是地址 但是要注意虽然类是引用传递&#xff0c;但是要注意&#xff0c;调用方法是新开一个栈 因此如果进行p null或者 Person p new Person()等语句&#xff0c;要格外注意&#xff1a; 如果主函数再次输出…...

拼音字符串相似度

拼音字符串相似度 拼音字符串相似度介绍参考代码**编辑距离****余弦相似度****Jaccard相似度**参考文档拼音字符串相似度 介绍 拼音相似度是指在拼音转换后,两个拼音字符串之间的相似程度。常用的拼音相似度度量方法包括编辑距离、余弦相似度和 Jaccard 相似度等。 编辑距离…...

如何创建一个基本的Mojolicious Web应用:探索Perl的现代Web框架

如何创建一个基本的Mojolicious Web应用&#xff1a;探索Perl的现代Web框架 Mojolicious是一个用Perl编写的简单、优雅的Web开发框架&#xff0c;它提供了一套丰富的工具和方法&#xff0c;让开发者能够快速构建高性能的Web应用。本文将详细介绍如何创建一个基本的Mojolicious…...

FPGA/数字IC复习八股

一、FPGA概念&#xff0c;与数字IC的区别 二、FPGA底层逻辑 三、同步电路、异步电路以及优缺点 四、同步复位、异步复位、异步复位同步释放 深入理解复位---同步复位&#xff0c;异步复位&#xff0c;异步复位同步释放(含多时钟域&#xff09;_画出支持异步复位dff的电路图…...

Android 简单快速实现 下弧形刻度尺(滑动事件)

效果图&#xff1a; 直接上代码&#xff1a; package com.my.view;import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Pai…...

【Go】常见的变量与常量

变量 常见的变量声明方式 一、声明单个变量的多种方式 1.声明一个变量初始化一个值 //声明变量 默认值是0&#xff0c;var a int//初始化一个值a 1fmt.Println(a) 2. 在初始化的时候省去数据类型&#xff0c;通过值自动匹配当前的变量的数据类型 var b 2fmt.Println(&quo…...

Qt使用sqlite数据库及项目实战

一.sqlite使用介绍 在Qt中使用SQLite数据库非常简单&#xff0c;SQLite是一个轻量级的嵌入式数据库&#xff0c;不需要单独的数据库服务器&#xff0c;完全使用本地文件来存储数据。 当在Qt中使用SQLite数据库时&#xff0c;需要涉及到一些SQL语句以及Qt中的相关函数&#xf…...

开源模型应用落地-FastAPI-助力模型交互-进阶篇(一)

一、前言 FastAPI 的高级用法可以为开发人员带来许多好处。它能帮助实现更复杂的路由逻辑和参数处理&#xff0c;使应用程序能够处理各种不同的请求场景&#xff0c;提高应用程序的灵活性和可扩展性。 在数据验证和转换方面&#xff0c;高级用法提供了更精细和准确的控制&#…...

精准选择广告工具,提升推广效果

在考虑使用巨量引擎之前&#xff0c;我们首先要明白它的本质。巨量引擎是一个付费广告平台&#xff0c;包含了多种推广工具&#xff0c;如巨量ID、巨量千川、巨量本地推&#xff0c;以及企业蓝V等。很多人希望通过这个平台提升抖音账号的流量和曝光度&#xff0c;但真正有效的流…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …...

如何应对敏捷转型中的团队阻力

应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中&#xff0c;明确沟通敏捷转型目的尤为关键&#xff0c;团队成员只有清晰理解转型背后的原因和利益&#xff0c;才能降低对变化的…...

解析两阶段提交与三阶段提交的核心差异及MySQL实现方案

引言 在分布式系统的事务处理中&#xff0c;如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议&#xff08;2PC&#xff09;通过准备阶段与提交阶段的协调机制&#xff0c;以同步决策模式确保事务原子性。其改进版本三阶段提交协议&#xff08;3PC&#xf…...

Monorepo架构: Nx Cloud 扩展能力与缓存加速

借助 Nx Cloud 实现项目协同与加速构建 1 &#xff09; 缓存工作原理分析 在了解了本地缓存和远程缓存之后&#xff0c;我们来探究缓存是如何工作的。以计算文件的哈希串为例&#xff0c;若后续运行任务时文件哈希串未变&#xff0c;系统会直接使用对应的输出和制品文件。 2 …...

Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解

文章目录 一、开启慢查询日志&#xff0c;定位耗时SQL1.1 查看慢查询日志是否开启1.2 临时开启慢查询日志1.3 永久开启慢查询日志1.4 分析慢查询日志 二、使用EXPLAIN分析SQL执行计划2.1 EXPLAIN的基本使用2.2 EXPLAIN分析案例2.3 根据EXPLAIN结果优化SQL 三、使用SHOW PROFILE…...