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

单片机之从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语言中&#xff0c;有一类数据结构&#xff0c;它可以存储一组相同类型的元素&#xff0c;并且可以通过索引访问这些元素&#xff0c;没错&#xff0c;这类数据结构就是数组。数组可以说是C语言中非常重要的数据结构之一了。使用数组可以是程序逻辑更加清晰&#xff0c;也更加…...

【码银送书第二十期】《游戏运营与出海实战:策略、方法与技巧》

市面上的游戏品种繁杂&#xff0c;琳琅满目&#xff0c;它们是如何在历史的长河中逐步演变成今天的模式的呢&#xff1f;接下来&#xff0c;我们先回顾游戏的发展史&#xff0c;然后按照时间轴来叙述游戏运营的兴起。 作者&#xff1a;艾小米 本文经机械工业出版社授权转载&a…...

String 类

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

Chromebook Plus中添加了Gemini?

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

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…...

使用国产工作流引擎,有那些好处?

使用国产工作流引擎的好处主要体现在以下几个方面&#xff1a; 符合企业独特业务&#xff1a; 国产工作流引擎可以深入挖掘和理解企业内部各项业务流程&#xff0c;精细化地定义流程模型和规则&#xff0c;实现“以流程驱动业务”的目标。这有助于企业更好地满足其独特的业务…...

掌握 Go 语言:使用 net/http/httptrace 包优化HTTP请求

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

探秘Flask中的表单数据处理

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、Flask中的表单处理机制 三、Flask表单处理实战 四、处理表单数据的注意事项…...

java —— 包装类及拆箱、装箱

java 当中有 8 种基本类型对应其相应的包装类&#xff0c;分别如下&#xff1a; intIntegerbyteByteshortShortlongLongfloatFloatdoubleDoublecharCharacterbooleanBoolean 一、装箱 两种装箱方法&#xff1a; public static void main(String[] args) {Integer anew Inte…...

运算符重载(下)

目录 前置和后置重载前置的实现Date& Date::operator()代码 后置的实现Date Date::operator(int )代码 前置--和后置--重载前置--的实现Date& Date::operator--( )代码 后置--的实现Date Date::operator--(int )代码 流插入运算符重载流插入运算符重载的实现流提取运算…...

杭州服务器的性能如何?

挥洒激情&#xff0c;开启杭州服务器的无限可能&#xff01; 互联网时代&#xff0c;服务器的性能就如同一艘航空母舰&#xff0c;承载着企业的发展梦想&#xff0c;指引着行业的发展方向。而对于杭州服务器&#xff0c;其性能究竟如何&#xff1f;让我来告诉您。 杭州服务器…...

linux centos nfs挂载两台服务器挂载统一磁盘目录权限问题

查看用户id id 用户名另一台为 修改uid和gid为相同id&#xff0c;添加附加组 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&#xff0c;thinkphp框架代码开源&#xff0c;不加密后台效果&#xff1a;手机版效果 这款是贷款平台源码/卡卡贷源码/小贷源码/完美版 后台51800 密码…...

软设之算法的效率

算法的效率分为时间复杂度和空间复杂度。 空间复杂度是指对一个算法在运行过程中临时占用存储空间大小的度量。一个算法的空间复杂度只考虑在运行过程中为局部变量分配的存储空间的大小。说白了&#xff0c;就是空间换时间。 比如说计算从123……100的和。一个算法是i(1100)*…...

前端开发(2)--HTML常用的标签

100编程书屋_孔夫子旧书网 HTMl 的标签可以分为单个标签和成对标签。 单个标签&#xff1a;html4 规定单个标签要有一个 / 表示结尾&#xff0c; html5 则不用 <!--单个标签--> <meta> <!--成对标签 --> <div></div>以下是HTMl中常用的一些标签…...

任何图≌自己这一几何最起码常识推翻直线公理让R外标准实数一下子浮出水面

黄小宁 h定理&#xff1a;点集AB≌B的必要条件是A≌B。 证&#xff1a;若AB则A必可恒等变换地变为BA≌A&#xff0c;而恒等变换是保距变换。证毕。 如图所示R轴即x轴各元点x沿x轴正向不保距平移变为点y2x就使x轴沿本身拉伸&#xff08;放大&#xff09;变换为y2x轴不≌x轴&…...

js 纯前端实现数组分页、列表模糊查询、将数组转成formdata格式传给接口

后端返回所有的数据&#xff0c;由前端来实现分页展示、模糊查询&#xff0c;并将数组格式转成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是一个开源的分布式搜索和分析引擎&#xff0c;它被广泛用于构建实时的、可扩展的搜索和分析应用程序。以下是Elasticsearch的主要用途和功能&#xff1a;12 全文搜索&#xff1a;Elasticsearch提供强大的全文搜索功能&#xff0c;可以处理大量的文本数据&…...

iOS自动连接已知Wi-Fi功能的实现

首先需要在配置文件申请的时候将hotspot勾选上&#xff0c;之后还要在x-code里添加对应的配置&#xff0c;由于我们并没有用到获取设备周边Wi-Fi的功能&#xff0c;所以就没申请相关权限 相关连接Wi-Fi代码如下&#xff1a; #import <NetworkExtension/NetworkExtension.h&…...

新手也能懂:用Altium Designer搞定SPI Flash、eMMC和USB3.0的PCB等长与阻抗控制

Altium Designer实战&#xff1a;SPI Flash、eMMC与USB3.0的等长布线及阻抗控制指南 刚接触高速PCB设计时&#xff0c;面对密密麻麻的规则手册总让人望而生畏。3H原则、500mil误差、阻抗匹配这些术语听起来像天书&#xff0c;但当你用Altium Designer&#xff08;AD&#xff09…...

Windows/Mac双平台实测:FORCE PRO 6.3.0求解器从注册到下载的完整配置流程

Windows/Mac双平台实测&#xff1a;FORCE PRO 6.3.0求解器从注册到下载的完整配置流程 在工程优化与控制领域&#xff0c;FORCE PRO求解器凭借其高效的数值计算能力和灵活的接口设计&#xff0c;已成为众多开发者的首选工具。最新发布的6.3.0版本在算法效率和平台兼容性上都有…...

OpenAPI状态机建模指南:用有限状态机设计RESTful API的终极方法 [特殊字符]

OpenAPI状态机建模指南&#xff1a;用有限状态机设计RESTful API的终极方法 &#x1f680; 【免费下载链接】OpenAPI-Specification The OpenAPI Specification Repository 项目地址: https://gitcode.com/gh_mirrors/op/OpenAPI-Specification OpenAPI Specification 是…...

Spring Security实战:Bcrypt加密算法在用户密码存储中的正确使用姿势(附完整代码)

Spring Security实战&#xff1a;Bcrypt加密算法在用户密码存储中的正确使用姿势&#xff08;附完整代码&#xff09; 在当今数字化时代&#xff0c;用户密码安全已成为系统开发中最基础也最关键的一环。作为开发者&#xff0c;我们经常面临一个核心问题&#xff1a;如何在数据…...

Unity 6升级后频繁闪退?别慌,这8个D3D11崩溃的修复方法亲测有效

Unity 6升级后D3D11崩溃全攻略&#xff1a;从快速修复到深度优化 刚升级到Unity 6的开发者们&#xff0c;是否正被突如其来的编辑器崩溃搞得焦头烂额&#xff1f;那些令人抓狂的"D3D11设备丢失"弹窗&#xff0c;不仅打断工作流&#xff0c;还可能让宝贵项目进度陷入停…...

在 SAP 系统中,利润中心(Profit Center)和业务范围(Business Area)都是用于内部管理报告的组织单元,但它们在设计理念、功能和应用上存在显著区别。简单来说,利润中心是更现代

在 SAP 系统中&#xff0c;利润中心&#xff08;Profit Center&#xff09;和业务范围&#xff08;Business Area&#xff09;都是用于内部管理报告的组织单元&#xff0c;但它们在设计理念、功能和应用上存在显著区别。简单来说&#xff0c;利润中心是更现代、更灵活、功能更强…...

探索音乐资源获取:如何通过开源工具畅享高品质音乐体验

探索音乐资源获取&#xff1a;如何通过开源工具畅享高品质音乐体验 【免费下载链接】lxmusic- lxmusic(洛雪音乐)全网最新最全音源 项目地址: https://gitcode.com/gh_mirrors/lx/lxmusic- 在数字音乐时代&#xff0c;寻找稳定、免费且高质量的音乐资源成为许多音乐爱好…...

Dynamic Deep Learning for Li-ion Battery Fault Detection: A Practical Approach with Real-world EV Da

1. 动态深度学习在锂电池故障检测中的核心价值 锂电池作为电动汽车的核心部件&#xff0c;其健康状况直接关系到整车的安全性和可靠性。传统基于阈值的检测方法在面对复杂多变的实际工况时&#xff0c;往往表现不佳。我们团队在实际测试中发现&#xff0c;某品牌车辆在低温环境…...

3步掌握AI模型训练:让新手也能玩转个性化Stable Diffusion模型

3步掌握AI模型训练&#xff1a;让新手也能玩转个性化Stable Diffusion模型 【免费下载链接】sd-trainer 项目地址: https://gitcode.com/gh_mirrors/sd/sd-trainer 在数字创意领域&#xff0c;AI绘画模型训练曾是一道高不可攀的技术门槛。设计师面对复杂的代码配置望而…...

多任务学习进阶:从MMoE到PLE的模型演进与实战解析

1. 多任务学习基础与核心挑战 多任务学习&#xff08;Multi-Task Learning, MTL&#xff09;是机器学习领域的一个重要分支&#xff0c;它让单个模型同时学习多个相关任务。想象一下&#xff0c;你正在教一个学生同时学习数学和物理。如果这两个学科有共同的基础概念&#xff0…...