0% found this document useful (0 votes)
31 views7 pages

2 1 Array

Array learning

Uploaded by

iiiasrcloud
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
31 views7 pages

2 1 Array

Array learning

Uploaded by

iiiasrcloud
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 7

陣列(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++中也是可行的,但並不建議使用,使用多維陣列會讓
元素的指定更加困難,此時適當的將資料加以分割,或是使用其它的資料結構來
解決,會比直接宣告多維陣列來得實在。

You might also like