陣列是一群相同型態的資料形成的集合,會佔用一整塊連續的記憶體空間。陣列的定義方式與一般變數非常相似:

#include <stdio.h>

int main()
{
	int a[5] = {7, 6, 5, 4, 3};	/* 有5個元素的陣列,並指定初始值 */
	int b[10] = {4, 5, 6};		/* 有10個元素的陣列,指定前3個初始值,後面為0 */
	int c[] = {9, 8, 7};		/* 有3個元素的陣列(陣列大小會自動計算),並指定初始值。 */
	int d[20];					/* 有20個元素的陣列,不指定初始值 */

	return 0;
}
在上例中,陣列 a 的 5 個元素與值分別為:
a[0] 7
a[1] 6
a[2] 5
a[3] 4
a[4] 3

陣列的索引值是從 0 開始,第一個元素必須用 a[0] 來取得。 另外,C 語言並不會記錄陣列的大小,所以必須另外用常數定義或變數儲存。

下面這個範例,會使用一個大小為 10 的陣列,接受使用者輸入 10 個數字後,重新印出並計算其和:

#include <stdio.h>

#define SIZE 10

int main()
{
	int a[SIZE], i, sum = 0;

	for(i=0;i<SIZE;i++){
		printf("Enter the value of a[%d]: ", i);
		scanf("%d", &a[i]);
	}
	
	/* 印出陣列的每個元素 */
	printf("Elements in array: ");
	for(i=0;i<SIZE;i++){
		printf("%d ", a[i]);
	}
	printf("\n");

	/* 計算其和 */
	for(i=0;i<SIZE;i++){
		sum += a[i];
	}
	printf("Sum of elements: %d\n",sum);

	return 0;
}

接著,我們對上述的範例進行一點擴充。 假設你需要設計一個程式,讓使用者輸入最多十個數字求其總和,並設計規格如下:


則程式內容可以如下:
#include <stdio.h>

#define SIZE 10

int main()
{
	int a[SIZE], n, i, sum = 0;

	while(1){
		scanf("%d", &n);
		if(n==0){
			break;
		}
		sum = 0;
		for(i=0;i<n;i++){
			scanf("%d", &a[i]);
		}
		for(i=0;i<n;i++){
			sum += a[i];
		}
		printf("%d\n", sum);
	}
	return 0;
}
當然,如果只是要求總和,可以不用透過陣列把每個數字都儲存下來, 但是也有其他應用,需要把所有數字存下來,才有辦法或者比較方便計算。

有時候,可以把索引值為 0 的地方浪費掉。 以下範例會用亂數模擬擲骰子 10000 次,並將結果存入陣列中。 存入結果時,是使用索引值 1~6 的空間,來存放各個點數出現的次數。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define SIZE 7
#define EXPNUM 10000

int main()
{
	int a[SIZE] = {0}, i;

	srand( time(NULL) );
	for(i=1;i<=EXPNUM;i++){
		a[ 1+rand()%6 ] += 1;
	}

	printf("Face\tAppearance\n");
	for(i=1;i<SIZE;i++){
		printf("%4d\t%4d\n", i, a[i]);
	}

	return 0;
}

如果需要將陣列傳到函式當中時,需要在變數名稱後方加上一組方括號。 下面範例中的 max 函式,可以找尋陣列中最大的元素:

#include <stdio.h>

#define SIZE 10

int max(int a[], int size){
	int i, m = a[0];
	for(i=1;i<size;i++){
		if(a[i]>m){
			m = a[i];
		}
	}
	return m;
}

int main()
{
	int a[SIZE], i, maxValue;
	for(i=0;i<SIZE;i++){
		printf("Enter the value of a[%d]: ", i);
		scanf("%d", &a[i]);
	}
	maxValue = max(a, SIZE);
	printf("Max value: %d\n", maxValue);
	return 0;
}
這邊請再次留意,C 語言並不會記錄陣列的大小,必須另外用常數定義或變數儲存,所以要將陣列大小告訴函式。

但要注意的是,如果把陣列丟到函式裡面,又在函式裡面更改陣列內容,是會影響到呼叫端的:

#include <stdio.h>

#define SIZE 5

void mytest(int a[], int size){
	int i;
	for(i=0;i<size;i++){
		a[i] += 3;
	}
}

int main()
{
	int a[SIZE] = {4,3,5,2,7}, i;
	
	printf("Original values:");
	for(i=0;i<SIZE;i++){
		printf(" %d", a[i]);
	}
	printf("\n");
	
	mytest(a, SIZE);
	
	printf("New values:");
	for(i=0;i<SIZE;i++){
		printf(" %d", a[i]);
	}
	printf("\n");
	
	return 0;
}