陣列的使用是為了儲存一連串同型態的值,例如同時整數或同是浮點數。因為陣列宣告之後是一連串相同大小的記憶體空間的組合,在儲存之後可以很快的利用相鄰空間之特性找到相關的值,並做好處理。
陣列之宣告
一般變數要使用前必須宣告,陣列的使用也是先從宣告開始,只是因為陣列的結構從一維到多維不等,宣告方式有一些小小的差別 。底來下整理一下不同維度陣度的宣告方式。
一維陣列宣告方式
dobuel quarter[4]; //宣告時指定陣列大小,可不指定初值
double quarter[4]={2345.2, 3456.34, 5100.5, 1400.5}; //宣告時指定初值,並指定陣列大小
double quarter[]={2345.2, 3456.34, 5100.5, 1400.5}; //宣告時指定初值,而且可不指定陣列大小,因為元素的數量即陣列大小
二維或多維陣列宣告方式
int scores[3][2]; //宣告時指定陣列大小,可不指定初值
int scores[3][2]={{74, 56}, {37, 68}, {33, 83}}; //宣告時指定陣列大小,並指定初值
存取陣列
上述兩種不同結構的陣列宣告方式,只差別在二維以上陣列宣告一定要給定陣列大小。事實上不給定陣列大小就宣告一維陣列也是有點冒險的行為,所以還是建議最好在宣告陣列的時候就給定陣列大小,有了這樣的宣告習慣之後,一維或多維陣列的宣告就沒有差別了。
宣告好的陣列就可以開始存取利用,使用陣列的方式就是透過 陣列名稱[索引值] 的方式來存取值。因為最前面有提到陣列在宣告之後就是一連串的記憶體空間組合,所以陣列名稱本身就代表該陣列的起始記憶體位置,而 [索引值] 則是代表此陣列的連續記憶體空間裡第幾個記憶體空間,並且索引值從0開始計數,範圍從0到陣列大小-1。
例如上述宣告之quarter陣列,quarter[0]可以得到 2345.2,quarter[1]可得到3456.34,依此類推。
我們利用陣列名稱[索引值]來存取陣列,那麼此索引值可以超過陣列大小嗎?事實上,如果你所指定的陣列大小超過該陣列合法的索引值範圍,在編譯的時候並不會出現錯誤,但如此一來你所存取的陣列元素將不正確,所以判斷元素大小是否合法是程式設計師的工作。
例如我們經常會利用for迴圈來走訪整個陣列,假設陣列大小為n,那麼for迴圈的寫法應是:
for(i=0;i<n;i++){
printf(“quarter[%d]=%f\n”,i , quarter[i]);
}
另外,如果我們是利用使用者的輸入值當索引值來存取陣列,那麼就要再加上判斷的語法:
int p;
printf(“請輸入元素索引(從0開始):”);
scanf(“%d”,&p);
if(p>=0 && p<n){
printf(“quarter[%d]=%f”, p, quarter[p]);
}else{
printf(“陣列索引值超過合法大小!!”);
}
把陣列當成函數的參數
陣列可以當成函數的參數,在函數的原型宣告可使用陣列或指標來宣告一個陣列參數,如:
void minElement(int [], int);
或
void minElement(int *, int);
因為傳入函數的陣列並不包含大小,所以為了在函數裡能夠存取正確的陣列大小,必須讓函數內部也知道此陣列之大小,因此可透過函數參數傳遞陣列大小,或使用#define設定陣列大小之常數,以供函數內部使用。
比較特殊的是,以二維以上的陣列當函數參數時,必須指定右維度的陣列尺度,如:
void maxGrades(int [][5]);
關於此點之作法,在後來接續到資料結構時知道原因。因為在C語言裡,陣列無論是一維或者多維,實際上內部的結構都是一維,所以當你宣告了一個多維陣列之後,實際上你也可以用一維陣列的語法來存取這個多維陣列。而且因為C是採用「以列為主」的方式來計算多維陣列的位置,所以最重要的就是欄數,也就是右維度的大小。所以在處理多維陣列時必須知道此陣列裡最小單位是連續幾個元素,如此才能正確分配此多維陣列之元素。再次提醒,因為C裡面的陣列變數並不包含元素大小的資訊,所以必須另外透過其他方式來指定陣列大小,包含此段文字所述之內內容。