陣列(Array) C++初階班
一維陣列
現在要整理全部學員的程式設計成績,希望寫個小程式,全班共有 25 名學
員,所以您必須有 25 個變數來儲存學員的成績。根據先前學過的內容,我們需
要宣告 25 個名稱不同的變數來儲存學員的成績資料嗎?
當然不需要這麼麻煩的,C++提供「陣列」 (Array)讓您可以宣告一個以「索
引」(index)作為識別的資料結構,宣告陣列的方式如下:
資料型態名稱[大小
資料型態名稱 大小];
大小
資料型態可以是 int、float、char 等等之前所學過的資料型態宣告,以下是幾
個宣告的範例:
int iarr[10]; // 宣告 10 個元素的整數 Array
double darr[10]; // 宣告 10 個元素的浮點數 Array
char carr[10]; // 宣告 10 個元素的字元 Array
這是靜態陣列
靜態陣列的宣告方式,陣列長度必須事先決定
靜態陣列 陣列長度必須事先決定,所以不可以使用變數來
陣列長度必須事先決定
事後決定陣列的長度;如果您要動態宣告
動態宣告陣列長度,可以使用一些資料結構與動
動態宣告
態記憶體宣告來解決陣列大小必須固定的問題,這在之後才會說明。
宣告陣列之後,陣列所配置到的記憶體空間中所儲存的數是未知的,所以在
初始陣列元素值之前,當中的元素值是未知的,如果您在宣告變數時尚未決定陣
列中的值,可以這麼宣告陣列:
int irr[10] = {0};
double darr[10] = {0.0};
char carr[10] = {'\0'};
bool barr[10] = {false};
上面的幾個宣告,整數陣列中的元素都會被初始為 0,浮點數陣列則會被初
字元陣列則會被初始為空字元(
始為 0.0,字元陣列則會被初始為空字元
字元陣列則會被初始為空字元 ),而 boolean 數陣列則會被初始
('\0')
為 false,在宣告陣列時初始陣列元素,可以避免其它的程式存取到非預期的數
值。
您也可以在宣告陣列時初始所有的陣列值,例如:
inti arr[5] = {0, 1, 2, 3, 4};
double darr[5] = {0.0, 0.1, 0.2, 0.3, 0.4};
char carr[5] = {'A', 'B', 'C', 'D', 'E'};
bool barr[5] = {false, true, false, true, false};
1
陣列(Array) C++初階班
當要存取陣列中的值時,可以使用下標(Subscript)運算子[ ]加上「索引」
(Index)指定要存取的陣列元素,C++的索引值一律由 0 開始,而不是由 1 開始,
這點初學者必須特別注意,下面這個簡單的程式可以告訴您如何使用索引存取陣
列元素:
#include <iostream>
using namespace std;
int main() {
const int length = 10;
int iarr[length] = {0};
for(int i = 0; i < length; i++)
cout << iarr[i] << " ";
cout << endl;
for(int i = 0; i < length; i++)
iarr[i] = i;
for(int i = 0; i < length; i++)
cout << iarr[i] << " ";
cout << endl;
return 0;
}
執行結果:
0000000000
0123456789
由於陣列本身並不知道自己的長度資訊,所以您必須額外記錄陣列長度,就
如程式中的 length 的作用。
C++中陣列的索引值由 0 開始並不是沒有原因的,事實上陣列名稱就指向陣
列記憶體的第一個位置的位址,而索引值表示所指定的陣列元素相對於陣列第一
個記憶體位置的位移量(Offset),位移的量與資料型態長度有關,如果是 int 整
數,則每次位移時是一個 int 整數的長度,例如在上例中 iarr[0]索引值為 0,所
以表示位移量為 0,自然就是指第一個元素,而 iarr[9]就是指相對於第一個元素
2
陣列(Array) C++初階班
的位移量為 9,C++就是根據陣列第一個元素的記憶體位置與位移量來得到所指
定要存取的陣列元素。
如果您在宣告陣列時只希望初始幾個元素,則可以這麼宣告:
intiarr[5] = {0, 1};
doubledarr[5] ={0.0, 0.1};
charcarr[5] ={'A', 'B'};
boolbarr[5] ={false, true};
像上例中,都只初始索引 0 與索引 1 的兩個元素,其它未初始的元素,整數
的話會自動初始為 0,浮點數的話會自動初始為 0.0,字元的話會自動初始為空
字元('\0'),而 boolean 數的話會自動初始為 false。
如果您在宣告陣列時會一併初始所有的元素,則 C++允許您不宣告陣列元素
大小,它會根據您指定的元素個數自動設定陣列大小,例如:
intiarr[] = {1, 2, 3};
doubledarr[] ={0.4, 3.2, 1.0, 4.2};
charcarr[] ={'A', 'B'};
上面宣告中,iarr[]的元素個數會是 3,darr[]的個數會是 4,而 carr[]的個數
會是 2。
陣列在使用時,得知陣列長度(元素個數)是必要的,您不可以存取超過陣
列長度的記憶體,這會發生無法預期的結果,然而如何得知陣列的長度,您可以
使用 sizeof()運算子,例如:
intiarr[] = {1, 2, 3,4, 5, 6};
cout<<"Array 長度:長度:"
<< (sizeof(iarr) / sizeof(iarr[0]))
<< endl;
這個例子會顯示陣列的長度為 6;sizeof()會傳回變數所指向的記憶體空間所
佔大小,您只要取得整個陣列的記憶體空間大小,再除以一個陣列元素的大小,
就可以如上取得陣列的長度了。
您不可以將陣列直接指定給另一個陣列,或是直接比較兩個陣列是否相同,
例如:
intarr1[5];
intarr2[5];
...
錯誤!
錯誤!不能直接指定陣列給另一個陣列
arr1= arr2; //錯誤
3
陣列(Array) C++初階班
...
if(arr1== arr2) {// 錯誤!
錯誤!不能直接比較兩個陣列是否相同
...
}
如果要將陣列指定給另一個陣列,您只能循序一個一個元素進行複製,例
如:
constint length = 5;
intarr1[length];
intarr2[length];
...
for(inti = 0; i< length; i++) {
arr1[i] = arr2[i];
}
同樣的,如果想比較兩個陣列元素內容是否相同,也要用一個個元素進行比
對。
4
陣列(Array) C++初階班
二維陣列
一維陣列使用陣列名稱與一個索引值來指定存取陣列元素,我們也可以宣告
二維陣列,二維陣列使用陣列名稱與兩個索引值來指定存取陣列元素,其宣告方
式與一維陣列類似:
intiarr[5][10];
上面這個宣告會配置 5*10 =50 個整數的記憶體空間給陣列來使用,二維陣
列使用兩個索引值來指定存取陣列,這兩個索引值都是由
這兩個索引值都是由 0 開始,下面這個程式
開始
簡單的示範二維陣列的存取:
#include <iostream>
using namespace std;
int main() {
const int row = 5;
const int column = 10;
int iarr[row][column];
for(int i = 0; i < row; i++)
for(int j = 0; j < column; j++)
iarr[i][j] = (i+1) * (j+1);
for(int i = 0; i < row; i++) {
for(int j = 0; j < column; j++)
cout << iarr[i][j] << "\t";
cout << endl;
}
return 0;
}
執行結果:
1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50
5
陣列(Array) C++初階班
在上面這個程式中,您宣告了 5 列(Row)10 行(Column)的陣列,第一個
[ ]是用來指定存取哪一列,第二個[]是用來指定存取哪一行,所以當我們使用
iarr[i][j]時,表示要存取 i 列 j 行的元素。
您也可以在宣告二維陣列的同時指定二維陣列的值,例如:
intiarr[2][3] = {{1,2, 3},
{4, 5, 6}};
從上面這個程式來看,就可以清楚的看出二維陣列的索引方式,您宣告了 2
列 3 行的陣列,可以使用{}與適當的斷行協助我們指定陣列初值,事實上如果您
清楚二維陣列的記憶體配置方式,您會理解到{ }其實是可以不用的,例如:
intiarr[2][3] = {1, 2,3,
4, 5, 6};
何謂二維陣列於記憶體中的配置方式?其實陣列存取時的行與列是我們為
了理解陣列元素的指定存取而想像出來的,索引值正確的意義,是指相對於陣列
第一個元素的位移量,例如在一維陣列中的陣列配置與索引意義如下圖所示:
對 int 整數陣列來說,每一位移量是 4 個位元組,而指定存取 iarr[4],相當
於指定存取相對於 iarr[0]四個位移量的記憶體空間。
即使是二維空間,其在記憶體中也是線性配置的,例如:
在上面的例子中,二維陣列將得到的記憶體分為兩個區塊,我們宣告陣列
6
陣列(Array) C++初階班
iarr[2[4],表示 iarr[0][0]與 iarr[1][0]相對位移量為 4,當我們指定存取 iarr[1][3]
時,表示存取的位置是相對於 iarr[1][0]位移 3 個單位。
請想想看,如果宣告 iarr[3][5]的話,記憶體位置的指定是如何呢?在這個陣
列中 5 的意義是 iarr[0][0]、iarr[1][0]與 iarr[2][0]的位置各相對 5 個位移量,如下
圖所示:
其實瞭解二維陣列在記憶體中的配置關係在現階段是不必要的,在固定長度
陣列的時候,還是使用列、行的輔助來指定會比較方便,然而瞭解二維陣列的線
瞭解二維陣列的線
性配置關係,
性配置關係 在指標存取時就很重要了,因為我們必須瞭解這個線性關係
,在指標存取時就很重要了 線性關係,以指
線性關係
定正確的位置來存取記憶體。
C++也可以利用同樣的道理宣告三維陣列,例如:
intiarr[2][4][6];
上面這段程式碼會宣告 2*4*6 = 48 個元素的陣列,而存取方式可以藉由立方
體的(x, y, z)關係來指定,也就是列、行與高。
多維以上的陣列在 C++中也是可行的,但並不建議使用,使用多維陣列會讓
元素的指定更加困難,此時適當的將資料加以分割,或是使用其它的資料結構來
解決,會比直接宣告多維陣列來得實在。