陣列是一群相同型態的資料形成的集合,會佔用一整塊連續的記憶體空間。陣列的定義方式與一般變數非常相似:
#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; }接著,我們對上述的範例進行一點擴充。 假設你需要設計一個程式,讓使用者輸入最多十個數字求其總和,並設計規格如下:
- 首先給一個正整數 n ≤ 10
- 接下來有 n 個整數,為待求其和之數字
- n 為 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; }