课程表

Arduino 基础

Arduino 函数库

Arduino 进阶

Arduino 项目

Arduino 传感器

Arduino 电机控制

Arduino 声音

工具箱
速查手册

Arduino - 多维数组

当前位置:免费教程 » 程序设计 » Arduino

具有两个维度(即,下标)的数组通常表示由以行和列排列的信息组成的值的表。

以下是多维数组的关键特性:

  • 为了识别特定的表元素,我们必须指定两个下标。

  • 按照惯例,第一个标识元素的行,第二个标识元素的列。

  • 需要两个下标来标识特定元素的数组称为二维数组或二维数组。

  • 具有两个或多个维度的数组称为多维数组,并且可以具有多于两个维度。

下图说明了一个二维数组, a 该数组包含三行四列,因此它是一个3乘4的数组。 通常,具有 m 行和 n 列的数组称为 m-by-n数组


m-by-n数组

数组 a 中的每个元素都由 a [i] [j] 形式的元素名称标识。 这里,a是数组的名称, i j 是唯一标识 a 中每个元素的下标。 注意,行0中的元素的名称都具有0的第一下标; 第3列中的元素的名称都具有第二下标3。


多维数组可以在其声明中初始化,就像一维数组。 例如,可以如下声明和初始化在其行0的元素中具有值1和2并且在其行1的元素中具有值3和4的二维数组 b

  1. 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。

  1. 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,并将最后两个元素隐式初始化为零。

  • 程序调用函数print Array来输出每个数组元素。 请注意,函数原型( k )指定了参数 const int a [] [columns]

  • 当函数接收一维数组作为参数时,函数的参数列表中的数组括号为空。

  • 也不需要二维阵列的第一维度(即,行数)的大小,但是需要所有后续维度大小。 编译器使用这些大小来确定多维数组中元素在内存中的位置。

  • 所有数组元素都连续存储在存储器中,而不考虑维数。 在二维阵列中,行0存储在存储器中,随后是行1。


例子

  1. void printArray ( const int [][ 3 ] ); // prototype
  2. const int rows = 2;
  3. const int columns = 3;
  4. int array1[ rows ][ columns ] = { { 1, 2, 3 }, { 4, 5, 6 } };
  5. int array2[ rows ][ columns ] = { 1, 2, 3, 4, 5 };
  6. int array3[ rows ][ columns ] = { { 1, 2 }, { 4 } };
  7.  
  8. void setup () {
  9.  
  10. }
  11. void loop () {
  12. Serial.print ("Values in array1 by row are: ") ;
  13. Serial.print (“\r" ) ;
  14. printArray(array1) ;
  15. Serial.print ("Values in array2 by row are: ") ;
  16. Serial.print (“\r" ) ;
  17. printArray(array2) ;
  18. Serial.print ("Values in array3 by row are: ") ;
  19. Serial.print (“\r" ) ;
  20. printArray(array3) ;
  21. }
  22.  
  23. // output array with two rows and three columns
  24.  
  25. void printArray( const int a[][ columns ] ) {
  26. // loop through array's rows
  27. for ( int i = 0; i < rows; ++i ) {
  28. // loop through columns of current row
  29. for ( int j = 0; j < columns; ++j )
  30. Serial.print (a[ i ][ j ] );
  31. Serial.print (“\r" ) ; // start new line of output
  32. }
  33. // end outer for
  34. }
  35.  
  36. // end function printArray


结果

  1. Values in array1 by row are:
  2. 1 2 3
  3. 4 5 6
  4. Values in array2 by row are:
  5. 1 2 3
  6. 4 5 0
  7. Values in array3 by row are:
  8. 1 2 0
  9. 4 0 0


注意 - 每一行都是一维数组。 要定位特定行中的元素,函数必须准确知道每行中有多少个元素,因此在访问数组时可以跳过适当数量的内存位置。 因此,当访问a [1] [2]时,函数知道跳过存储器中的第0行的三个元素以得到行1.然后,函数访问该行的元素2。 许多常见的数组操作使用 FOR 语句。

例如,以下 FOR 语句设置数组 a 第2行中的所有元素。

  1. for ( int column = 0; column < 4; ++column )
  2. a[ 2 ][ column ] = 0;


FOR 语句仅变化第二个下标(即下标)。 前面的 FOR 语句等同于以下赋值语句:

  1. a[ 2 ][ 0 ] = 0;
  2. a[ 2 ][ 1 ] = 0;
  3. a[ 2 ][ 2 ] = 0;
  4. a[ 2 ][ 3 ] = 0;


以下嵌套FOR 语句确定数组 a 中所有元素的总和 -

  1. total = 0;
  2. for ( int row = 0; row < 3; ++row )
  3. for ( int column = 0; column < 4; ++column )
  4. total += a[ row ][ column ];

FOR 语句一次将数组的元素排成一行。 外部 FOR 语句通过将行(即行下标)设置为0开始。因此,第0行的元素可以由内部 FOR 语句进行求和。


外部 FOR 语句然后将行增加为1,因此,可以对行1的元素进行求和。 然后,外部 FOR 语句将行增加为2,因此,可以合计第2行的元素。 当嵌套的 FOR 语句终止时,total包含所有数组元素的总和。

转载本站内容时,请务必注明来自W3xue,违者必究。
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号