Day 11 - 阵列 a

简介- 为什麽要使用阵列?

当我们想要宣告一个变数的时候,我们可以一次叫一个

像是这样

#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 11【连动 MetaMask - Pop Up & Login Detection】Can`t use current password.

>>:  台南的空气是甜的吧

DAY 24 Full Screen Modal

接着我们要做的是打开 menu hamberger 後的 full screen modal,里面包...

Day03 建立一个 React 专案

1.建立一个新的React 专案 npx create-react-app first-app cd...

如何在Windows 10中修复损坏的系统档案

您是否在使用Windows 10时是否出现系统错误?或者您的Windows 10变得反应太慢?您是否...

Day11 小实作-数字时钟

使用 React useState Hook 创建数字时钟 import React, {useSt...

铁人赛 Day13-- MySQL函式

mysqli_num_rows() 取得查询笔数 可以使用 mysqli_num_rows() 函式...