当前位置: 首页 > 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&…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...