- Arduino 教程
- Arduino - 首页
- Arduino - 概述
- Arduino - 开发板描述
- Arduino - 安装
- Arduino - 程序结构
- Arduino - 数据类型
- Arduino - 变量与常量
- Arduino - 运算符
- Arduino - 控制语句
- Arduino - 循环
- Arduino - 函数
- Arduino - 字符串
- Arduino - 字符串对象
- Arduino - 时间
- Arduino - 数组
- Arduino 函数库
- Arduino - I/O 函数
- Arduino - 高级 I/O 函数
- Arduino - 字符函数
- Arduino - 数学库
- Arduino - 三角函数
- Arduino 高级
- Arduino - Due & Zero
- Arduino - 脉冲宽度调制
- Arduino - 随机数
- Arduino - 中断
- Arduino - 通信
- Arduino - 互联集成电路
- Arduino - 串行外设接口
- Arduino 项目
- Arduino - 闪烁 LED
- Arduino - 渐变 LED
- Arduino - 读取模拟电压
- Arduino - LED 条形图
- Arduino - 键盘注销
- Arduino - 键盘消息
- Arduino - 鼠标按钮控制
- Arduino - 键盘串口
- Arduino 传感器
- Arduino - 湿度传感器
- Arduino - 温度传感器
- Arduino - 水位检测/传感器
- Arduino - PIR 传感器
- Arduino - 超声波传感器
- Arduino - 连接开关
- 电机控制
- Arduino - 直流电机
- Arduino - 伺服电机
- Arduino - 步进电机
- Arduino 和声音
- Arduino - 音调库
- Arduino - 无线通信
- Arduino - 网络通信
- Arduino 有用资源
- Arduino - 快速指南
- Arduino - 有用资源
- Arduino - 讨论
Arduino - 多维数组
具有两个维度(即下标)的数组通常表示由按行和列排列的信息组成的值表。
以下是多维数组的关键特征:
要识别特定表元素,必须指定两个下标。
按照惯例,第一个标识元素的行,第二个标识元素的列。
需要两个下标才能识别特定元素的数组称为二维数组或 2-D 数组。
具有两个或多个维度的数组称为多维数组,并且可以具有两个以上的维度。
下图说明了一个二维数组 a。该数组包含三行四列,因此它是一个 3x4 数组。一般来说,具有 m 行和 n 列的数组称为 m x n 数组。
数组 a 中的每个元素都由以下形式的元素名称标识:a[i][j]。这里,a 是数组的名称,i 和 j 是唯一标识 a 中每个元素的下标。请注意,第 0 行中的元素名称都具有 0 的第一个下标;第 3 列中的元素名称都具有 3 的第二个下标。
多维数组可以在其声明中初始化,就像一维数组一样。例如,一个二维数组 b,其第 0 行元素的值为 1 和 2,第 1 行元素的值为 3 和 4,可以声明并初始化如下:
int b[ 2 ][ 2 ] = { { 1, 2 }, { 3, 4 } };
这些值在花括号中按行分组。因此,1 和 2 分别初始化 b[0][0] 和 b[0][1],3 和 4 分别初始化 b[1][0] 和 b[1][1]。如果给定行没有足够的初始化程序,则该行的其余元素将初始化为 0。因此,以下声明将 b[0][0] 初始化为 1,b[0][1] 初始化为 0,b[1][0] 初始化为 3,b[1][1] 初始化为 4。
int b[ 2 ][ 2 ] = { { 1 }, { 3, 4 } };
示例
以下是一个演示在声明中初始化二维数组的示例。
第 a-c 行声明了三个数组,每个数组都具有两行三列。
array1 的声明(第 a 行)在两个子列表中提供了六个初始化程序。第一个子列表将数组的第 0 行初始化为值 1、2 和 3;第二个子列表将数组的第 1 行初始化为值 4、5 和 6。
如果从 array1 初始化程序列表中删除每个子列表周围的花括号,编译器将初始化第 0 行的元素,然后是第 1 行的元素,从而产生相同的结果。
array2 的声明(第 b 行)仅提供了五个初始化程序。
初始化程序分配给第 0 行,然后是第 1 行。任何没有显式初始化程序的元素都初始化为零,因此 array2[1][2] 初始化为零。
array3 的声明(第 c 行)在两个子列表中提供了三个初始化程序。
第 0 行的子列表将第 0 行的前两个元素显式初始化为 1 和 2;第三个元素隐式初始化为零。
第 1 行的子列表将第一个元素显式初始化为 4,并将最后两个元素隐式初始化为零。
程序调用函数 printArray 来输出每个数组的元素。请注意,函数原型(第 k 行)指定参数 const int a[][columns]。
当函数接收一维数组作为参数时,函数参数列表中的数组括号为空。
二维数组的第一维的大小(即行数)也不需要,但所有后续维度的尺寸都需要。编译器使用这些尺寸来确定多维数组中元素在内存中的位置。
所有数组元素都连续存储在内存中,无论维度多少。在二维数组中,第 0 行存储在内存中,然后是第 1 行。
示例
void printArray ( const int [][ 3 ] ); // prototype const int rows = 2; const int columns = 3; int array1[ rows ][ columns ] = { { 1, 2, 3 }, { 4, 5, 6 } }; int array2[ rows ][ columns ] = { 1, 2, 3, 4, 5 }; int array3[ rows ][ columns ] = { { 1, 2 }, { 4 } }; void setup () { } void loop () { Serial.print ("Values in array1 by row are: ") ; Serial.print (“\r” ) ; printArray(array1) ; Serial.print ("Values in array2 by row are: ") ; Serial.print (“\r” ) ; printArray(array2) ; Serial.print ("Values in array3 by row are: ") ; Serial.print (“\r” ) ; printArray(array3) ; } // output array with two rows and three columns void printArray( const int a[][ columns ] ) { // loop through array's rows for ( int i = 0; i < rows; ++i ) { // loop through columns of current row for ( int j = 0; j < columns; ++j ) Serial.print (a[ i ][ j ] ); Serial.print (“\r” ) ; // start new line of output } // end outer for } // end function printArray
结果
Values in array1 by row are: 1 2 3 4 5 6 Values in array2 by row are: 1 2 3 4 5 0 Values in array3 by row are: 1 2 0 4 0 0
注意 - 每一行都是一个一维数组。要定位特定行中的元素,函数必须准确知道每一行中有多少个元素,以便在访问数组时可以跳过适当数量的内存位置。因此,当访问 a[1][2] 时,函数知道要跳过内存中第 0 行的三个元素才能到达第 1 行。然后,函数访问该行的第 2 个元素。许多常见的数组操作使用 FOR 语句。
例如,以下 FOR 语句设置数组 a 的第 2 行中的所有元素。
for ( int column = 0; column < 4; ++column ) a[ 2 ][ column ] = 0;
FOR 语句仅更改第二个下标(即列下标)。前面的 FOR 语句等效于以下赋值语句:
a[ 2 ][ 0 ] = 0; a[ 2 ][ 1 ] = 0; a[ 2 ][ 2 ] = 0; a[ 2 ][ 3 ] = 0;
以下 嵌套 FOR 语句确定数组 a 中所有元素的总和:
total = 0; for ( int row = 0; row < 3; ++row ) for ( int column = 0; column < 4; ++column ) total += a[ row ][ column ];
FOR 语句一次对数组的元素求和一行。外部 FOR 语句首先将行(即行下标)设置为 0。因此,内部 FOR 语句可以对第 0 行的元素求和。
然后,外部 FOR 语句将行递增到 1,以便可以对第 1 行的元素求和。然后,外部 FOR 语句将行递增到 2,以便可以对第 2 行的元素求和。当嵌套 FOR 语句终止时,总和包含所有数组元素的总和。