单片机之从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,且小于数组元素的大小。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/19585.shtml

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

相关文章

IDEA 中导入脚手架后该如何处理?

MySQL数据库创建啥的&#xff0c;没啥要说的&#xff01;自行配置即可&#xff01; 1.pom.xml文件&#xff0c;右键&#xff0c;add Maven Project …………&#xff08;将其添加为Maven&#xff09;【下述截图没有add Maven Project 是因为目前已经是Maven了&#xff01;&…

react useState基本使用

1. React Hooks介绍 React Hooks是React 16.8版本引入的新特性&#xff0c;它允许在不编写类的情况下使用state和其他React特性。Hooks的引入极大地简化了组件的编写&#xff0c;使得函数式组件能够拥有类似类组件的功能。 1.1 函数式组件与类组件的区别 函数式组件与类组件…

LNMP安装部署

yum -y install ncurses ncurses-devel bison cmake openssl-devel gcc gcc-c make 方法二

差旅游记|绵阳印象:与其羡慕他人,不如用力活好自己。

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 来绵阳之前同事就问: “雷工&#xff0c;能吃辣嘛&#xff1f;”。 “还行&#xff0c;能吃点辣。” “那你去了四川别说能吃点辣&#xff0c;那边的能吃点比跟你说的能吃点不太一样” 01 你好 今天打车&#xff0c;上…

这篇文章让你彻底了解如何实用tcpdump 抓包

直接看例子&#xff1a; tcpdump tcp-i ens33 -t -s 0 -c 100 and dst port ! 22 and src net 192.168.1.0/24 -w ./target.cap &#xff08;1&#xff09;tcp∶ ip icmp arp rarp 和 tcp、udp、icmp这些选项等都要放到第一个参数的位置&#xff0c;用来过滤数据报的类型 &…

Go 语言中常量和变量的定义、使用

Go 语言&#xff0c;作为一种现代编程语言&#xff0c;以其简洁性和高效性赢得了开发者的青睐。在 Go 语言中&#xff0c;常量与变量作为存储和操作数据的基本元素&#xff0c;扮演着至关重要的角色。通过正确理解和使用常量与变量&#xff0c;开发者可以编写出更加健壮和高效的…

「多客」圈子论坛社区交友系统开源版小程序源码|圈子社区系统

简述 社交圈子论坛系统是一种面向特定人群或特定话题的社交网络&#xff0c;它提供了用户之间交流、分享、讨论的平台。在这个系统中&#xff0c;用户可以创建、加入不同的圈子&#xff0c;圈子可以是基于兴趣、地域、职业等不同主题的。用户可以在圈子中发帖、评论、点赞等互…

抖音太可怕了,我卸载了

这两天刷短视频&#xff0c;上瘾了&#xff0c;太可怕了。 自己最近一直在研究短视频制作&#xff0c;所以下载了抖音&#xff0c;说实话&#xff0c;我之前手机上并没有抖音&#xff0c;一直在用B站。 用了两天抖音&#xff0c;我发现&#xff0c;这玩意比刷B站还容易上瘾啊…

国产GPU算力公司及产品

目前&#xff0c;中国有多家从事国产算力GPU研发与生产的企业&#xff0c;以下是一些代表性的公司及其相关产品概述&#xff1a; 景嘉微&#xff1a; 近期&#xff0c;景嘉微宣布成功研发了“景宏系列”AI算力产品&#xff0c;该系列面向AI训练、AI推理、科学计算等领域&#x…

Centos 7下的VulFocus靶场搭建详细教程

一、靶场介绍 自带 Flag 功能&#xff1a;每次启动 flag 都会自动更新&#xff0c;明确漏洞是否利用成功。带有计分功能。兼容 Vulhub、Vulapps 中所有漏洞镜像。 二、下载安装 下载 VMware 软件下载 centos镜像 三、Docker知识 学习链接&#xff1a;https://www.runoob.c…

chrome调试手机网页

前期准备 1、 PC端安装好chrmoe浏览器 2、 安卓手机安装好chrmoe浏览器 3、 数据线 原文地址&#xff1a;https://lengmo714.top/343880cb.html 手机打开调试模式 进入手机设置&#xff0c;找到开发者模式&#xff0c;然后启用USB调试 打开PC端chrome调试功能 1、点击chr…

【康耐视国产案例】AI视觉相机创新 加速商超物流数智化转型

连锁商超/零售店正面临着因消费者购物习惯改变等挑战&#xff0c;迎来了以新兴技术崛起而催生的数字化物流体系转型需求。物流行业与AI机器视觉的深度融合&#xff0c;解决了传统机器视觉识别速度慢、环境要求高、定制化部署耗时过多等痛点&#xff0c;大大提高了物流供应链的效…

GD32F470+lwip 丢包问题分析及解决

最近在用GD32和管理机之间用TCP协议开发一个功能&#xff0c;功能都没问题&#xff0c;后面跑大量发包时候的连续测试时&#xff0c;总是会出现偶发性的&#xff0c;大概几分钟到数十分钟的一次丢包。尽管在应用层做了超时机制&#xff0c;一旦超时就会重新建立socket链接并重新…

QT系列教程(6) 几种标准对话框

几种标准对话框 本文介绍几种标准对话框&#xff0c;都是Qt封装好的&#xff0c;我们先创建一个界面&#xff0c;添加几个按钮&#xff0c;然后分别在几个按钮的回调函数里添加创建不同对话框的逻辑 颜色对话框 颜色对话框用来选择颜色&#xff0c;创建后会显示各种颜色和透明…

GPT-4o:人工智能的新里程碑

GPT-4o&#xff0c;作为OpenAI最新推出的人工智能技术&#xff0c;无疑在人工智能领域掀起了新一轮的浪潮。这款新型的语言模型不仅继承了GPT系列的核心优势&#xff0c;更在多个方面实现了突破性的进展。以下&#xff0c;我们将从版本间的对比分析、GPT-4o的技术能力以及个人整…

html中table的替代方案

使用插件&#xff0c;2个功能强大的table插件 DataTables | Javascript table library 专门的table处理插件&#xff0c;下载时可以配置是否支持bootstrap和jquery ui等。参数众多。表格组件 table - Layui 文档 国内的插件&#xff0c;只支持jquery&#xff0c;配合默认的layu…

ABB码垛机器人IRB260通讯板维修

ABB码垛机器人在现代制造业中发挥着重要作用&#xff0c;而机器人通讯板维修对于确保机器人的正常运行至关重要。 通讯板是ABB码垛机器人与控制系统之间进行数据传输的桥梁。它负责接收控制系统的指令&#xff0c;并将机器人的运行数据反馈给控制系统。如果通讯板出现故障&…

Qos基础

一、Qos概述 Qos是一个框架&#xff0c;解决服务质量&#xff0c;尽力而为模型&#xff0c;集成服务以及区分服务模型&#xff0c;流量分类与标识。 使用Qos是带宽不够。 每个接口有硬件队列和软件队列&#xff08;队列排满了就不会再排&#xff09;。 企业宽带一般都是上行和下…

模糊C均值(FCM)算法更新公式推导

模糊C均值&#xff08;FCM&#xff09;算法更新公式推导 目标函数 FCM的目标函数为&#xff1a; J m ∑ i 1 n ∑ j 1 k u i j m ∥ x i − c j ∥ 2 J_m \sum_{i1}^n \sum_{j1}^k u_{ij}^m \|x_i - c_j\|^2 Jm​i1∑n​j1∑k​uijm​∥xi​−cj​∥2 其中&#xff1a; …

7个Python爬虫入门小案例

大家好&#xff0c;随着互联网的快速发展&#xff0c;数据成为了新时代的石油。Python作为一种高效、易学的编程语言&#xff0c;在数据采集领域有着广泛的应用。本文将详细讲解Python爬虫的原理、常用库以及实战案例&#xff0c;帮助读者掌握爬虫技能。 一、爬虫原理 爬虫&a…