當我們想要宣告一個變數的時候,我們可以一次叫一個
像是這樣
#include<iostream>
using namespace std;
int main(){
int numberA = 0;
int numberB = 10;
int numberC = 89;
int numberD = 19;
cout << numberA + numberB << " " << numberB + numberC << " " << numberC + numberD;
}
雖然說這樣宣告,還不太累,但是如果今天有一大串數字(可能 500 個整數),我們總不可能一個一個來宣告吧。
所以,這時候陣列就派得上用場了。
陣列可以把他想成矩陣
在矩陣中有一維矩陣、二維矩陣、三維矩陣
一維矩陣 就像是一串數列:
[1, 2, 3 ,4 ,5 ,6 ,7 ,8 ]
二維矩陣就像是一面棋盤:
三維矩陣....有點難解釋,可以把它想像成是由很多二維矩陣疊起來組成一個很大的櫃子:
陣列就跟矩陣式一模一樣的,但只是他把這些數字轉換到電腦裡面,以電腦裡面的方式去運作。
在C++中,我們要如何宣告一個一維陣列呢?
非常簡單
公式如下:
*data type array name* [*number of elements*]
所以一個簡單的例子:
int score[4] = {0, 56, 60, 90};
這樣子就可以宣告一個陣列了
但是有沒有注意到一件事
宣告一個陣列的時候,同時也會宣告這個陣列的資料型態:
所以拿上面的陣列 score 來舉例
他的資料型態就是 int,且總共是由 10 個 int 所組成。
!!!注意注意!!!
在陣列裡面,編碼會從 0 開始一直到妳宣告的數量(n) - 1為止。
所以我們拿上面那個 score 舉例,如果今天我們要叫出 score 中的第1項還有第3項怎麼辦?
要這樣做:
cout << score[0] << " " << score[2];
但是,如果今天我們想要取出每一項陣列的元素要怎麼辦?
這時候,我們就會搭配loop 來使用 :
例如:
#include<iostream>
using namespace std;
int main()
{
int score[4] = {0, 56, 60, 90};
for (int i = 0;i < 4; i++)
cout << score[i] << " ";
}
這樣就可以利用 for loop 來印出陣列中的每一項了。
你知道陣列會爆炸嗎?
如果你今天讓一個大小只有 5 個 int 的一維陣列,做超過其他的事情,他很可能會告訴你 Runtime error
這是為什麼?
那我們必須了解一下陣列的運作方式:
在我們宣告一個一維陣列之後,像這樣:
int anArray[4] = {0};
記憶體會給予這個陣列一段空間 像是這樣:
【宣告陣列的記憶體】
Address | Identifier | Value |
---|---|---|
0x20c648 | score[0] | 0 |
0x20c64c | score[1] | 0 |
0x20c650 | score[2] | 0 |
0x20c654 | score[3] | 0 |
在這邊有沒有發現一個神奇的東西,就是在記憶體裡面的地址 (起始位置)
其實就是 16 進位的表示方式喔 !
另外還有沒有發現一件蠻奇怪的事情?
就是為什麼明明 score[0] 跟 score[1] 只差了1,但是他們記憶體的地址卻不只有加1? 還跑出了一個莫名其妙的 c
???
這是因為阿,我們宣告的陣列是 int
所以代表陣列裡面的每一項都是一個 int
在前面幾天我稍微介紹了 int 會佔據記憶體 4 byte
所以我們可以來數一下 :
先不管前面都長得一樣的數字 (0x20c)
score[0] → 648
因為這個int 佔據了 4 個 byte (也就是說中間經過了8 9 a(10) b(11))
所以理所當然,下一個 int 的起始位置就會是 64c 了!
score[1] → 64c
這邊同理,因為經過了四個 (c(12) d(13) e(14) f(15))
所以下一個就會進位,最小的位置就會回到 0
score[2] → 650
了解了陣列的運作方式,可以了解到 陣列變數就是一段 address
所以當你做這件事情的時候:
int Array0 = {0};
cout << Array0;
會得到一串奇怪的數字像是這樣0x6ffe10
其實就是印出了這一個陣列的 起始位置
那講了那麼久,怎麼還沒爆?
好啦其實他也不是真的會爆炸,只是會跑出我們都無法預測的結果而已
例如:
#include<iostream>
using namespace std;
int main()
{
int Array0[2] = {0};
for(int i = 0; i < 10; i++)
cout << Array0[i] << endl;
return 0;
}
如果我們只有宣告一個長度只有2的一維陣列,但是又做出超過2的事情會怎樣?
我自己的電腦跑出來的結果是長這樣,但是在每個人的電腦裡面長的又不太一樣。
0 0 1 3 11473824 0 4199400 0 0 0
這是因為,原本那些地址上就已經存在了其他資料沒有被刪掉,而我們剛好取到了我們沒有宣告的地方,所以跑出了這些不知道在哪裡存取的資料。
最近在查資料的時候,有時候原本很不想查,想要直接問人,畢竟當伸手牌最快嘛
但是後來想了想,還是自己GOOGLE了,因為我認為自己查到的東西才會記得更久也更深刻