陣列也可以有多個維度,適合用來存放表格、矩陣等資料。 一維陣列需要一個索引值,例如 a[3];而多維陣列,則需要多個索引值。 以一個 2-by-3 的二維陣列為例,其長像如下:
  0th column1st column2nd column
0th rowa[0][0]a[0][1]a[0][2]
1st rowa[1][0]a[1][1]a[1][2]

二維陣列的宣告方法跟一維陣列非常相似,只是我們現在需要多指定一個維度的大小:

#include <stdio.h>

#define ROW 2
#define COL 3

int main()
{
	int a[ROW][COL] = { {1, 2, 3}, {4, 5, 6} }; /* 2-by-3 的二維陣列,並指定所有的初始值 */
	int b[ROW][COL] = {4, 5, 6, 7}; /* 2-by-3 的二維陣列,從第 0 個 row 開始指定初始值,後面為 0 */
	int c[ROW][COL] = { {9, 8}, {7} }; /* 2-by-3 的二維陣列,分別指定不同 row 的初始值,沒指定到的為 0。 */
	int i, j;

	for(i=0;i<ROW;i++){
		for(j=0;j<COL;j++){
			printf("%2d ", a[i][j]);
		}
		printf("\n");
	}

	for(i=0;i<ROW;i++){
		for(j=0;j<COL;j++){
			printf("%2d ", b[i][j]);
		}
		printf("\n");
	}

	for(i=0;i<ROW;i++){
		for(j=0;j<COL;j++){
			printf("%2d ", c[i][j]);
		}
		printf("\n");
	}

	return 0;
}

如果要將多維陣列丟進 function 裡面,則後面的維度都要指定大小。 因為陣列在記憶體裡面是一個 row 接著一個存放,編譯器需要事先知道什麼時候該換到下一個 row。 例如將前面的範例中,重複的印出部分變成 function,則會如下:

#include <stdio.h>

#define ROW 2
#define COL 3

void printArray(int array[][COL], int rowNum, int colNum){
	int i, j;
	for(i=0;i<rowNum;i++){
		for(j=0;j<colNum;j++){
			printf("%2d ", array[i][j]);
		}
		printf("\n");
	}
	printf("\n");
}

int main()
{
	int a[ROW][COL] = { {1, 2, 3}, {4, 5, 6} }; /* 2-by-3的二維陣列,並指定所有的初始值 */
	int b[ROW][COL] = {4, 5, 6, 7}; /* 2-by-3的二維陣列,從第0個row開始指定初始值,後面為0 */
	int c[ROW][COL] = { {9, 8}, {7} }; /* 2-by-3的二維陣列,分別指定不同row的初始值,沒指定到的為0。 */

	printArray(a, ROW, COL);
	printArray(b, ROW, COL);
	printArray(c, ROW, COL);

	return 0;
}

數值的指派跟讀取也和之前的一般變數和一維陣列相當,以下示範矩陣相加:

#include <stdio.h>

#define ROW 2
#define COL 3

void printArray(int array[][COL], int rowNum, int colNum){
	int i, j;
	for(i=0;i<rowNum;i++){
		for(j=0;j<colNum;j++){
			printf("%2d ",array[i][j]);
		}
		printf("\n");
	}
	printf("\n");
}

int main()
{
	int a[ROW][COL], b[ROW][COL], c[ROW][COL], i, j;

	printf("Input A:\n");
	for(i=0;i<ROW;i++){
		printf("Input row %d: ", i);
		for(j=0;j<COL;j++){
			scanf("%d", &a[i][j]);
		}
	}
	
	printf("Input B:\n");
	for(i=0;i<ROW;i++){
		printf("Input row %d: ", i);
		for(j=0;j<COL;j++){
			scanf("%d", &b[i][j]);
		}
	}
	
	for(i=0;i<ROW;i++){
		for(j=0;j<COL;j++){
			c[i][j] = a[i][j] + b[i][j];
		}
	}
	
	printArray(a, ROW, COL);
	printArray(b, ROW, COL);
	printArray(c, ROW, COL);

	return 0;
}

矩陣相乘的做法則需要多一層迴圈,如下, 其中由於 c 矩陣跟計算總和時一樣,會被拿來累加,因此要記得正確的初始化:

#include <stdio.h>

#define ROW 3
#define COL 3

void printArray(int array[][COL], int rowNum, int colNum){
	int i, j;
	for(i=0;i<rowNum;i++){
		for(j=0;j<colNum;j++){
			printf("%2d ",array[i][j]);
		}
		printf("\n");
	}
	printf("\n");
}

int main()
{
	int a[ROW][COL];
	int b[ROW][COL];
	int c[ROW][COL] = {0};
	int i, j, k;

	printf("Enter values of matrix a:\n");
	for(i=0;i<ROW;i++){
		for(j=0;j<COL;j++){
			printf("Enter a[%d][%d]: ",i,j);
			scanf("%d",&a[i][j]);
		}
	}

	printf("Enter values of matrix b:\n");
	for(i=0;i<ROW;i++){
		for(j=0;j<COL;j++){
			printf("Enter b[%d][%d]: ",i,j);
			scanf("%d",&b[i][j]);
		}
	}

	for(i=0;i<ROW;i++){
		for(j=0;j<COL;j++){
			for(k=0;k<COL;k++){
				c[i][j] += a[i][k]*b[k][j];
			}
		}
	}

	printArray(a, ROW, COL);
	printArray(b, ROW, COL);
	printArray(c, ROW, COL);

	return 0;
}