多維陣列

前頁 目錄 下頁

宣告及引用個別的陣列元素 在宣告陣列時把陣列的元素初始化

宣告及引用個別的陣列元素 Top

以下是宣告多維陣列的例子︰

C++ 版本 等同的 Turbo Pascal 版本
int a[5][3], b [2][3][4]; var
  a: array[0..4, 0..2] of integer;
  b: array[0..1, 0..2, 0..3] of integer;

留意以上的宣告語句不能寫成「int a[5, 8], b[2, 3, 4]」

對於宣告語句「int a[5][3]」,二維陣列 a 可以展示成以下的樣子︰

a

[0]

[1]

[2]

[0]

a[0][0]

a[0][1]

a[0][2]

[1]

a[1][0]

a[1][1]

a[1][2]

[2]

a[2][0]

a[2][1]

a[2][2]

[3]

a[3][0]

a[3][1]

a[3][2]

[4]

a[4][0]

a[4][1]

a[4][2]

一個二維陣列可以想像為一個陣列的陣列,每一列可以想像成一個一維陣列。當以上二維陣列儲存在存貯器時,第一個元素是 a[0][0],跟著的是 a[0][1],然後是 a[0][2]、 a[1][0]、……、等等。

留意每個下標必須被一對方括號包圍著。

三維陣列、四維陣列等不能在這兒用圖表達得清楚,但引用陣列元素的方法和二維陣列相似。


在說明陣列時把陣列的元素初始化 Top

以下的例子展示一個多維陣列如何被初始化︰

int n[2][3] = {{14, 23, 7}, {10, 5, 8}};

n

[0]

[1]

[2]

[0]

14

23

7

[1]

10

5

8

如果陣列不在被宣告時被初始化,陣列內各元素必須分開被初始化。

如果陣列元素的數目比初始值的數目多,那麼剩餘的元素的初始值會是零。例如︰

int n[2][3] = {{14, 23}, {10}};

n

[0]

[1]

[2]

[0]

14

23

0

[1]

10

0

0

如果陣列宣告時沒有被初始化,陣列的內容是不可預知的,直至元素被個別初始化為止。

如果初始值的數目比陣列元素的數目多,這樣會有編譯時的錯誤。

多維陣列的宣告語句中,陣列的大小不可以省略(第一層除外)。如果第一層沒有聲明,該陣列必須在宣告時初始化(使用初始值表),第一層的大小取決於初始值表,例如︰

C++ 語句 解釋
int a[][2] = {{3, 4}, {7}, {2, 3}}; 這宣告語句是有效的,第一層的大小是 3。
int a[][4]; 這宣告語句是無效的,因為陣列沒有立刻被初始化。
int a[3][] = {{4, 74}, {3, 2}, {1, 3}} 這宣告語句是無效的,因為決少了第二層的大小。
int a[][] = {{4, 7}, {3, 2}, {1,3}} 如上。

以下程序使用了一個兩維陣列︰

程序二十六︰使用二維陣列
C++ 版本 Pascal 版本
#include <iostream.h>
main()
{
 
int table[10][10], i, j;

  for (i = 0; i < 10; i++)
    for (j = 0; j < 10; j++)
      table[i][j] = i * j;

  cout << "  |";
  for (i = 0; i < 10; i++)
    cout << " " << i << "|";
  cout << endl;
  for (i = 1; i <= 11; i++)
    cout << "--+";
  cout << endl;
  for (i = 0; i < 10; i++) {
    cout << " " << i << "|";
    for (j = 0; j < 10; j++) {
      if (
table[i][j] < 10)
        cout << " ";
      cout <<
table[i][j] << " ";
    }
    cout << endl;
  }
  return 0;
}
program prog_26(input, output);
var
 
table: array[0..9, 0..9] of integer;
  i, j: integer;
begin
  for i := 0 to 9 do
    for j := 0 to 9 do
      table[i, j] := i * j;

  write('  |');
  for i := 0 to 9 do
    write(' ', i, '|');
  writeln;
  for i := 1 to 11 do
    write('--+');
  writeln;
  for i := 0 to 9 do begin
    write(' ', i, '|');
    for j := 0 to 9 do begin
      if
table[i, j] < 10 then
        write(' ');
      write(
table[i, j], ' ')
    end;
    writeln
  end
end.
輸出範例︰
  | 0| 1| 2| 3| 4| 5| 6| 7| 8| 9|
--+--+--+--+--+--+--+--+--+--+--+
 0| 0  0  0  0  0  0  0  0  0  0
 1| 0  1  2  3  4  5  6  7  8  9
 2| 0  2  4  6  8 10 12 14 16 18
 3| 0  3  6  9 12 15 18 21 24 27
 4| 0  4  8 12 16 20 24 28 32 36
 5| 0  5 10 15 20 25 30 35 40 45
 6| 0  6 12 18 24 30 36 42 48 54
 7| 0  7 14 21 28 35 42 49 56 63
 8| 0  8 16 24 32 40 48 56 64 72
 9| 0  9 18 27 36 45 54 63 72 81

前頁 目錄 下頁