C++/陣列
你可以將陣列想像成是一連串的箱子,裏面都放了數字。
簡介
[編輯]陣列與一般變數的差別在於,陣列在記憶體中的位置是連續的。
位置 | A0FF10 | A0FF11 | A0FF12 | A0FF13 | A0FF14 |
變數 | a
|
b
|
c
| ||
值 | 0 | 1 | 2 |
位置 | 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,以此類推。
※指派初始值時要用花括號括住,並以逗號分隔。
如果不想要將每個索引指派值可以用, ,
(空)或用NULL
、nullptr
或建構子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};
讀寫
[編輯]其餘部分皆一樣,除了需要注意最右邊的是第一個維度。
多維陣列
[編輯]你甚至可以使用更多維的陣列,都與上面的方法相同,最重要的還是最右邊的是第一個維度。