具有兩個維度(即,下標(biāo))的數(shù)組通常表示由排列在行和列中的信息組成的值的表格。
以下是多維數(shù)組的關(guān)鍵特性:
為了識別特定的表格元素,我們必須指定兩個下標(biāo)。
按照慣例,第一個標(biāo)識元素的行,第二個標(biāo)識元素的列。
需要兩個下標(biāo)來標(biāo)識特定元素的數(shù)組稱為二維數(shù)組或2D數(shù)組。
具有兩個或多個維度的數(shù)組稱為多維數(shù)組,并且可以具有多于兩個維度。
下圖說明了一個二維數(shù)組 a 。該數(shù)組包含三行四列,因此它是一個3乘4的數(shù)組。通常,具有 m 行和 n 列的數(shù)組稱為 m乘n數(shù)組。
數(shù)組 a 中的每個元素都由 a[i][j] 形式的元素名稱標(biāo)識。這里,a是數(shù)組的名稱, i 和 j 是 a 中唯一標(biāo)識每個元素的下標(biāo)。注意,行0中的元素的名稱都有第一下標(biāo)0;第3列中的元素的名稱都有第二下標(biāo)3。
多維數(shù)組可以在其聲明中初始化,就像一維數(shù)組一樣。例如,一個二維數(shù)組 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 } };
下面是一個演示在聲明中初始化二維數(shù)組的例子。
行a-c聲明三個數(shù)組,每個數(shù)組有兩行和三列。
array1(行a)的聲明在兩個子列表中提供了六個初始化器。第一個子列表將數(shù)組的第0行初始化為值1,2和3;第二個子列表將數(shù)組的第1行初始化為值4,5和6。
如果將每個子列表的大括號從array1初始化器列表中移除,那么編譯器將初始化第0行的元素,然后是第1行的元素,產(chǎn)生相同的結(jié)果。
array2(行b)的聲明只提供了5個初始化器。
初始化器分配給第0行,然后分配給第1行。任何沒有顯式初始化器的元素都將被初始化為零,因此array2[1][2]初始化為零。
array3(行c)的聲明在兩個子列表中提供了三個初始化器。
第0行的子列表明確地將第0行的前兩個元素初始化為1和2;第三個元素被隱式地初始化為零。
第1行的子列表明確地將第一個元素初始化為4,并隱式地將最后兩個元素初始化為零。
程序調(diào)用函數(shù)print Array來輸出每個數(shù)組的元素。請注意,函數(shù)原型(行k)指定了參數(shù) const int a[][columns] 。
當(dāng)函數(shù)接收到一維數(shù)組作為參數(shù)時,函數(shù)的參數(shù)列表中的數(shù)組括號是空的。
二維數(shù)組的第一維度(即,行數(shù))的大小也不是必需的,但是所有后續(xù)的維度大小都是必需的。編譯器使用這些大小來確定多維數(shù)組中元素的內(nèi)存位置。
無論維數(shù)如何,所有數(shù)組元素都連續(xù)存儲在內(nèi)存中。在二維數(shù)組中,第0行存儲在內(nèi)存中,隨后是第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
注意 - 每一行都是一維數(shù)組。要定位特定行中的元素,函數(shù)必須準(zhǔn)確知道每行中的元素數(shù)量,以便在訪問數(shù)組時可以跳過適當(dāng)數(shù)量的內(nèi)存位置。因此,當(dāng)訪問a[1][2]時,函數(shù)知道跳過內(nèi)存中第0行的三個元素到達(dá)第1行。然后,函數(shù)訪問該行的元素2。許多常見的數(shù)組操作使用 FOR 語句。
例如,以下 FOR 語句設(shè)置數(shù)組 a 第2行中的所有元素。
for ( int column = 0; column < 4; ++column ) a[ 2 ][ column ] = 0;
FOR 語句只改變第二個下標(biāo)(即,列下標(biāo))。前面的 FOR 語句等同于以下賦值語句:
a[ 2 ][ 0 ] = 0; a[ 2 ][ 1 ] = 0; a[ 2 ][ 2 ] = 0; a[ 2 ][ 3 ] = 0;
以下嵌套FOR 語句確定數(shù)組 a 中所有元素的總和:
total = 0; for ( int row = 0; row < 3; ++row ) for ( int column = 0; column < 4; ++column ) total += a[ row ][ column ];
FOR 語句一次一行地將數(shù)組的元素加總在一起。外部 FOR 語句首先將行(即,行下標(biāo))設(shè)置為0。因此,第0行的元素可以由內(nèi)部 FOR 語句進(jìn)行合計。
外部 FOR 語句然后將行增加到1,這樣,可以對第1行的元素進(jìn)行合計。然后,外部 FOR 語句將行增加為2,這樣,可以對第2行的元素進(jìn)行合計。當(dāng)嵌套的 FOR 語句終止時,總數(shù)包含所有數(shù)組元素的和。
更多建議: