跳至內容

C++/陣列

維基教科書,自由的教學讀本
< C++

你可以將陣列想像成是一連串的箱子,裏面都放了數字。

簡介

[編輯]

陣列與一般變數的差別在於,陣列在記憶體中的位置是連續的。

記憶體 int a = 0, b = 1, c = 2;
位置 A0FF10 A0FF11 A0FF12 A0FF13 A0FF14
變數 a b c
0 1 2
記憶體 int i = {0, 1, 2, 3, 4};
位置 A0FF10 A0FF11 A0FF12 A0FF13 A0FF14
變數 i[0] i[1] i[2] i[3] i[4]
0 1 2 3 4

使用

[編輯]

建立

[編輯]
int i[5];

這表示建立一個叫做i且長度5的整數(一維)陣列。另外,陣列也可以使用各種修飾詞,例如const(常數),參見下面的〈指派初始值〉。

※在建立陣列時,必須設定其長度,換言之,不能使用int i[];,否則電腦將不知道要分配多少空間。

初始化

[編輯]
int i[5] = {0, 1, 2, 3, 4};

這樣可以指派第一個位置為0,第二個為1,以此類推。

※指派初始值時要用花括號括住,並以逗號分隔。


如果不想要將每個索引指派值可以用, ,(空)或用NULLnullptr建構子int()

int i[5] = {0, 1, , 3, 4};
int i[5] = {0, 1, NULL, 3, 4};
int i[5] = {0, 1, nullptr, 3, 4};
int i[5] = {0, 1, int(), 3, 4};

char ch[5] = {'a', 'b', char(), 'd', 'e'};

可以看到,字元類別也可以使用建構子char(),每種型別都有他的建構子,如double()

讀寫

[編輯]

寫入

[編輯]
// 每一段程式碼都是一樣的
int i[5] = {0, 1, 2, 3, 4};

i[0] = 0;
i[1] = 1;
i[2] = 2;
i[3] = 3;
i[4] = 4;

i = {0, 1, 2, 3, 4};

可以看到陣列寫入值與一般變數更改值並無差別。值得注意的是,當你使用中間的方法時要使用的運算子是[](陣列存取運算子),並在裏面置入索引值。

讀取

[編輯]
int i[5] = {0, 1, 2, 3, 4};
int a = i[0];

讀取時,並沒有差別,因為它都代表同一個位置,只是它是在賦值運算子左邊,代表得到值的對象(寫入);或是在右邊,代表給出值的對象(讀取)差別而已。

※第一個索引值是0。

[編輯]

這是有原因的,畢竟「第零個」本來就很怪,發明C++的人也不想這樣。

底下是記憶體空間的一部份,在執行了一段程式碼後。

int i[5] = {0, 1, 2, 3, 4};
記憶體
位置 A0FF10 A0FF14 A0FF18 A0FF22 A0FF26
0 1 2 3 4
表示(使用[] i[0] i[1] i[2] i[3] i[4]
表示(實際上) *(i+0) *(i+1) *(i+2) *(i+3) *(i+4)

所以,會有[0]就是因為它是加0個位置,[1]就是後面1個位置,以此類推。

複製

[編輯]

如果要將一陣列複製給另一個陣列,不能像下面這樣直接指派,這是一般變數的作法。

copy = i;

所以必須把它當做一般迴圈變數處理,像這樣:

for(int j=0; j<sizeof(i)/sizeof(int); j++) {
    copy[j] = i[j];
}

進階

[編輯]

二維陣列

[編輯]

前面的一維陣列是一條直線,二維陣列則可以想像成是一個矩形。

一維陣列
[0] [1] [2] [3] [4]
二維陣列
[0][0] [0][1] [0][2] [0][3] [0][4]
[1][0] [1][1] [1][2] [1][3] [1][4]
[2][0] [2][1] [2][2] [2][3] [2][4]
[3][0] [3][1] [3][2] [3][3] [3][4]
[4][0] [4][1] [4][2] [4][3] [4][4]

建立

[編輯]
int i[5][5];

這樣可以建立一個5×5的二維陣列,與一維陣列一樣,它也可以使用修飾詞。

※最右邊的是第一個維度。

初始化
[編輯]
int i[5][5] = {{0, 1, 2, 3, 4},
               {5, 6, 7, 8, 7},
               {10, 11, 12, 13, 14},
               {15, 16, 17, 18, 19},
               {20, 21, 22, 23, 24}};

這裏的其中一對花括號其實可以不用,但是為了可讀性通常還是會加上,下面兩段程式是一樣的。

int i[3][5] = {{0, 1, 2, 3, 4},
               {5, 6, 7, 8, 9},
               {10, 11, 12, 13, 14}};

int i[3][5] = {0, 1, 2, 3, 4,
               5, 6, 7, 8, 9,
               10, 11, 12, 13, 14};

讀寫

[編輯]

其餘部分皆一樣,除了需要注意最右邊的是第一個維度

多維陣列

[編輯]

你甚至可以使用更多維的陣列,都與上面的方法相同,最重要的還是最右邊的是第一個維度