单片机之从C语言基础到专家编程 - 4 C语言基础 - 4.13数组
C语言中,有一类数据结构,它可以存储一组相同类型的元素,并且可以通过索引访问这些元素,没错,这类数据结构就是数组。数组可以说是C语言中非常重要的数据结构之一了。使用数组可以是程序逻辑更加清晰,也更加具有可读性。
1 数组的声明和初始化
1)数组的声明
在C语言中,数组的声明方式如下:
type arrayName[arraySize];
- type:数组中元素的数据类型
- arrayName:数组的名字
- arraySize:数组的大小(即数组中可以存储的元素个数)
例如,声明一个包含5个LED端口的数组:
GPIO_TypeDef* LED_PortLists[5];
声明一个包含5个LED引脚的数组
uint16_t LED_PinLists[5];
2)数组的初始化
数组可以在声明的同时进行初始化:
GPIO_TypeDef* LED_PortLists[5] =
{GPIOA,GPIOA,GPIOA,GPIOA,GPIOA,
};uint16_t LED_PinLists[5] =
{GPIO_Pin_10, GPIO_Pin_11, GPIO_Pin_12, GPIO_Pin_13, GPIO_Pin_14,
};
也可通过索引进行初始化,[index]中index为索引值。如:
GPIO_TypeDef* LED_PortLists[5] =
{[0] = GPIOA, [1] = GPIOA, [2] = GPIOA, [3] = GPIOA, [4] = GPIOA,
};uint16_t LED_PinLists[5] =
{[LED_DEBUG] = GPIO_Pin_10, [LED_FUN] = GPIO_Pin_11, [LED_RUN] = GPIO_Pin_12, [LED_TEMPEATATURE] = GPIO_Pin_13, [LED_FAULT] = GPIO_Pin_14,
};
如果初始化的元素个数少于数组大小,未初始化的元素会被自动赋值为0:
GPIO_TypeDef* LED_PortLists[5] = {0}; // 等价于 {0, 0, 0, 0, 0}
也可以省略数组大小,让编译器自动计算:
GPIO_TypeDef* LED_PortLists[] = {GPIOA, GPIOA, GPIOA, GPIOA, GPIOA}; // 数组大小自动为5
2 数组元素的访问
数组元素可以通过索引访问,索引从0开始:
uint16_t LED_DEBUG_PIN = LED_PinLists[0]; //访问第一个元素
uint16_t LED_FUN_PIN = LED_PinLists[1]; //访问第一个元素
可以通过索引修改数组元素的值:
LED_PinLists[0] = GPIO_Pin_9; // 将第一个元素的值修改为GPIO_Pin_9
在没有引用数组类型前,我们前面是这样来操作LED灯的。
void LED_DebugSetOn(void)
{GPIO_ResetBits(LED_DEBUG_PORT , LED_DEBUG_PIN); // 关闭
}void LED_DebugSetOff(void)
{GPIO_ResetBits(LED_DEBUG_PORT , LED_DEBUG_PIN); // 关闭
}void LED_DebugSet(bool value)
{if(value == false){GPIO_ResetBits(LED_DEBUG_PORT , LED_DEBUG_PIN); // 关闭} else{GPIO_SetBits(LED_DEBUG_PORT, LED_DEBUG_PIN); // 点亮}
}void LED_Set(LED_t led,bool value)
{switch (led){case LED_DEBUG:LED_DebugSet(value);break;default:break;}
}
在引用了数组类型后,代码就变成了这样:
void LED_Set(LED_t led,bool value)
{if(value == false){GPIO_ResetBits(LED_PortLists[led] , LED_PinLists[led] ); // 关闭} else{GPIO_SetBits(LED_PortLists[led] , LED_PinLists[led]); // 点亮}
}
3 二维数组
二维数组类似于矩阵,可以用两个索引来访问元素。声明方式如下:
type arrayName[rows][columns];
- type:数组中元素的数据类型
- arrayName:数组的名字
- rows:数组中行数的大小
- columns:数组中列数的大小
例如,声明一个2行3列的二维数组:
uint16_t LED_PinMatrixs[2][3];
二维数组的初始化:
uint16_t LED_PinMatrixs[2][3] =
{{GPIO_Pin_1, GPIO_Pin_2, GPIO_Pin_3},{GPIO_Pin_4, GPIO_Pin_5, GPIO_Pin_6},
};
可以通过两个索引访问二维数组的元素:
uint16_t LED_PinValue = LED_PinMatrixs[1][2]; // 访问第一行第二列的元素,GPIO_Pin_2
LED_PinMatrixs[0][0] = GPIO_Pin_0; // 修改第一行第一列的元素
4 常见数组操作
1) 数组遍历
通过循环遍历数组的每个元素:
for (int i = 0; i < LED_NUM; i++)
{LED_Set((LED_t)i,true); //LED灯全亮
}
2) 查找元素
遍历数组,查找特定元素的位置:
uint16_t LED_PinValue = GPIO_Pin_3;
int index = -1;
for (int i = 0; i < LED_NUM; i++)
{if (LED_PinLists[i] == LED_PinValue) {index = i;break;}
}
if (index != -1)
{printf("元素 %d 在数组中的位置是 %d\n", target, index);
}
else
{printf("数组中没有找到元素 %d\n", target);
}
3) 元素移位
通过循环将数组中的元素依次向前移一位
uint16_t LED_PinValue = LED_PinLists[LED_NUM - 1];for(int i = LED_NUM - 1;i > 0;i--)
{LED_PinLists[i]=LED_PinLists[i-1];
}
LED_PinLists[0] = LED_PinValue;
4) 二维数组转换为一维数组
int rows = 2;
int columns = 3;uint16_t LED_PinMatrixs[2][3] =
{{GPIO_Pin_1, GPIO_Pin_2, GPIO_Pin_3},{GPIO_Pin_4, GPIO_Pin_5, GPIO_Pin_6},
};uint16_t LED_PinList[rows * columns];
for (int i = 0; i < rows; i++)
{for (int j = 0; j < columns; j++) {LED_PinList[i * columns + j] = LED_PinMatrixs[i][j];}
}
5 数组名的本质
数组名的本质是指向该数组第一个元素的指针,关于指针,我们后面再讨论
6 使用数组的注意事项
1)在通过数组索引访问数组元素时,一定要注意数组的边界,即索引大小应小于数组元素的大小,5个数组元素,其索引值最大为4。
2)数组索引值从0开始计算。索引值应大于等于0,且小于数组元素的大小。
相关文章:
单片机之从C语言基础到专家编程 - 4 C语言基础 - 4.13数组
C语言中,有一类数据结构,它可以存储一组相同类型的元素,并且可以通过索引访问这些元素,没错,这类数据结构就是数组。数组可以说是C语言中非常重要的数据结构之一了。使用数组可以是程序逻辑更加清晰,也更加…...

【码银送书第二十期】《游戏运营与出海实战:策略、方法与技巧》
市面上的游戏品种繁杂,琳琅满目,它们是如何在历史的长河中逐步演变成今天的模式的呢?接下来,我们先回顾游戏的发展史,然后按照时间轴来叙述游戏运营的兴起。 作者:艾小米 本文经机械工业出版社授权转载&a…...

String 类
目录: 一. 认识 String 类 二. String 类的基本用法 三. String对象的比较 四.字符串的不可变性 五. 认识 StringBuffer 和 StringBuilder 一. 认识 String 类: 在C语言中已经涉及到字符串了,但是在C语言中要表示字符串只能使用字符数组或者…...

Chromebook Plus中添加了Gemini?
Chromebook Plus中添加了Gemini? 前言 就在5月29日,谷歌宣布了一项重大更新,将其Gemini人工智能技术集成到Chromebook Plus笔记本电脑中。这项技术此前已应用于谷歌的其他设备。华硕和惠普已经在市场上销售的Chromebook Plus机型,…...

Git Large File Storage (LFS) 的安装与使用
Git Large File Storage [LFS] 的安装与使用 1. An open source Git extension for versioning large files2. Installing on Linux using packagecloud3. Getting Started4. Error: Failed to call git rev-parse --git-dir: exit status 128References 1. An open source Git…...
使用国产工作流引擎,有那些好处?
使用国产工作流引擎的好处主要体现在以下几个方面: 符合企业独特业务: 国产工作流引擎可以深入挖掘和理解企业内部各项业务流程,精细化地定义流程模型和规则,实现“以流程驱动业务”的目标。这有助于企业更好地满足其独特的业务…...

掌握 Go 语言:使用 net/http/httptrace 包优化HTTP请求
掌握 Go 语言:使用 net/http/httptrace 包优化HTTP请求 介绍net/http/httptrace 包的基础概述适用场景 使用httptrace进行网络请求追踪配置httptrace的基本步骤示例:创建一个简单的HTTP客户端,使用httptrace监控连接 示例:追踪HTT…...

探秘Flask中的表单数据处理
新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、引言 二、Flask中的表单处理机制 三、Flask表单处理实战 四、处理表单数据的注意事项…...
java —— 包装类及拆箱、装箱
java 当中有 8 种基本类型对应其相应的包装类,分别如下: intIntegerbyteByteshortShortlongLongfloatFloatdoubleDoublecharCharacterbooleanBoolean 一、装箱 两种装箱方法: public static void main(String[] args) {Integer anew Inte…...

运算符重载(下)
目录 前置和后置重载前置的实现Date& Date::operator()代码 后置的实现Date Date::operator(int )代码 前置--和后置--重载前置--的实现Date& Date::operator--( )代码 后置--的实现Date Date::operator--(int )代码 流插入运算符重载流插入运算符重载的实现流提取运算…...
杭州服务器的性能如何?
挥洒激情,开启杭州服务器的无限可能! 互联网时代,服务器的性能就如同一艘航空母舰,承载着企业的发展梦想,指引着行业的发展方向。而对于杭州服务器,其性能究竟如何?让我来告诉您。 杭州服务器…...

linux centos nfs挂载两台服务器挂载统一磁盘目录权限问题
查看用户id id 用户名另一台为 修改uid和gid为相同id,添加附加组 usermod -u500 -Gwheel epms groupmod -g500 epms...

STL:string
文章目录 标准库中的string类string的构造string的赋值重载string的容量size(length)max_sizeresizereservecapacityclearemptyshink_to_fit string的元素访问operator[] 和 atfront 和 back string的迭代器 和 范围forstring的修改operatorappendpush_backassigninserterasere…...

贷款借钱平台 小额贷款系统开发小额贷款源码 贷款平台开发搭建
这款是贷款平台源码/卡卡贷源码/小贷源码/完美版 后台51800 密码51800 数据库替换application/database.php程序采用PHPMySQL,thinkphp框架代码开源,不加密后台效果:手机版效果 这款是贷款平台源码/卡卡贷源码/小贷源码/完美版 后台51800 密码…...
软设之算法的效率
算法的效率分为时间复杂度和空间复杂度。 空间复杂度是指对一个算法在运行过程中临时占用存储空间大小的度量。一个算法的空间复杂度只考虑在运行过程中为局部变量分配的存储空间的大小。说白了,就是空间换时间。 比如说计算从123……100的和。一个算法是i(1100)*…...

前端开发(2)--HTML常用的标签
100编程书屋_孔夫子旧书网 HTMl 的标签可以分为单个标签和成对标签。 单个标签:html4 规定单个标签要有一个 / 表示结尾, html5 则不用 <!--单个标签--> <meta> <!--成对标签 --> <div></div>以下是HTMl中常用的一些标签…...

任何图≌自己这一几何最起码常识推翻直线公理让R外标准实数一下子浮出水面
黄小宁 h定理:点集AB≌B的必要条件是A≌B。 证:若AB则A必可恒等变换地变为BA≌A,而恒等变换是保距变换。证毕。 如图所示R轴即x轴各元点x沿x轴正向不保距平移变为点y2x就使x轴沿本身拉伸(放大)变换为y2x轴不≌x轴&…...
js 纯前端实现数组分页、列表模糊查询、将数组转成formdata格式传给接口
后端返回所有的数据,由前端来实现分页展示、模糊查询,并将数组格式转成formdata格式给后端 1、数组转formdata let formData new FormData()for (let i 0; i < list.length; i) {let item list[i];for (let property in item) {formData.append(…...
elasticsearch有什么用
Elasticsearch是一个开源的分布式搜索和分析引擎,它被广泛用于构建实时的、可扩展的搜索和分析应用程序。以下是Elasticsearch的主要用途和功能:12 全文搜索:Elasticsearch提供强大的全文搜索功能,可以处理大量的文本数据&…...

iOS自动连接已知Wi-Fi功能的实现
首先需要在配置文件申请的时候将hotspot勾选上,之后还要在x-code里添加对应的配置,由于我们并没有用到获取设备周边Wi-Fi的功能,所以就没申请相关权限 相关连接Wi-Fi代码如下: #import <NetworkExtension/NetworkExtension.h&…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...

R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...

从物理机到云原生:全面解析计算虚拟化技术的演进与应用
前言:我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM(Java Virtual Machine)让"一次编写,到处运行"成为可能。这个软件层面的虚拟化让我着迷,但直到后来接触VMware和Doc…...