iT邦幫忙

2021 iThome 鐵人賽

DAY 11
0

簡介- 為什麼要使用陣列?

當我們想要宣告一個變數的時候,我們可以一次叫一個

像是這樣

#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 所組成。


With loop

!!!注意注意!!!

在陣列裡面,編碼會從 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了,因為我認為自己查到的東西才會記得更久也更深刻


上一篇
Day 10 - 轉換人生跑道
下一篇
Day 12 - 陣列 b
系列文
三十天內用C++寫出一個小遊戲30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言