Day 12 - 阵列 b

简介

上一篇介绍了一维阵列的用法还有如何宣告,今天就来介绍二维阵列

还有一些我们在写 code 时需要注意的一些小习惯。


阵列是一段地址

[ Review ]

在上次,我们提到了,

我们在宣告阵列的时候,就像是在宣告一个阵列的初始位置。

像是这样:

int Array[10] = {0};
cout << Array;

结果就会跑出一段位於记忆体上面的位置。像是0x6ffe10 之类的

如果我们今天宣告一个阵列: 然後检查看看他的大小,可以更了解这个概念:

int Array[] = {1, 2, 3};
cout << sizeof(Array) << "\n"; // 就像是一栋大楼
cout << sizeof(Array[0]); // 就像是一栋大楼的第一户人家

这样第一行就会印出 12

    第二行就会印出 4。
    

二维阵列

宣告

二维阵列的宣告就跟一维的差不多:

                           (列)         (栏)
*data type*  *array name* [ rows ] [ columns ];

就只是在列数的後面加上一个栏数

所以如果我们这样宣告:

int ArrayExample [3] [7];

如果把它图像化会长成这样:

其实可以想像成,有三个一维阵列,每一个阵列里面有 7 个项目(变数)

像这样:

[0] : [0][0] 、[0][1] 、[0][2] 、[0][3] 、[0][4] 、[0][5] 、[0][6] 。

[1] : [1][0] 、[1][1] 、[1][2] 、[1][3] 、[1][4] 、[1][5] 、[1][6] 。

[2] : [2][0] 、[2][1] 、[2][2] 、[2][3] 、[2][4] 、[2][5] 、[2][6] 。

如果我们今天要把资料输入进去的话,

可以先记得,排列的方式是长这样:

1.[0][0]

2.[0][1]

3.[0][2]

4.[0][3]

........

但为什麽不先换行再换列呢,像是这样

1.[0][0]

2.[1][0]

3.[2][0]

4.[3][0]

........

详细原因的话等等会说明。

例子:

int Array1[2][3] = {{4, 5, 6}, {7, 8, 9}};
int Array2[2][3] = {4, 5, 6, 7, 8, 9} 

如果是这样子宣告的话,他的二维阵列示意图会长这样:


位置图是这样:

[0][0] [0][1] [0][2]

[1][0] [1][1] [1][2]

那如果是这样宣告:

int Array3[2][3] = {{4, 5}{7, 8, 9}}

画成示意图会长这样:

可以看到

[0][0] [0][1] [0][2]

[1][0] [1][1] [1][2]

[0][2] 的地方变成了 0,而我们在宣告的时候,因为第一列的数字只有宣告{4, 5},所以当最後一项并没有宣告数字,所以变成了原本存在於记忆体那个位置的数字 0

再下面这个例子中可以看到,

int Array4[2][3] = {4, 5, 6, 7, 8};

我们宣告了六个阵列变数的位置,但是只有给他五个数字,因此会得到:

这样子的结果,如果依照下面这张位置对比的话,就可以发现,他真的是按照

[0][0] → [0][1] → [0][2] → [1][0] → [1][1]

这个顺序下去,所以在最後一项会变成 0。


那为什麽是这样子排呢 ?

例如今天宣告一个 2*3 的阵列

int Array[2][3] = {0};

在记忆体里面,位置的排列是这样子:

正因为他是这样子排列,所以当你输入数字的时候,就会是依照这样的顺序输入。


Cin 二维阵列?

那如果今天要输入一个二维阵列的时候要怎麽办呢?

其实很简单,用两个回圈就可以解决了。

int Array[3][5] = {0};

for (int i = 0; i < 3; i++)
{
	for (int j = 0; j < 5; j++)
	{
		cin >> Array[i][j];
	}
}

这样就可以把想要的数值输入到二维阵列里面去了。

如果不太懂两层回圈的,可以这样子想:

先从第一层开始想:

从 i = 0 开始 :

j = 0

j = 1

j = 2

j = 3

j = 4

接下来就会变成

i = 1:

里面又有

j = 0

j = 1

j = 2

j = 3

j = 4

以此类推。


写 Code 好习惯

  1. 曾经有一个厉害的人说过, "Always initialize your Variables"

    现在已经变成我写程序的时候铭记在心的一句金句。

    之前我们也提过,变数都要初始化,像是

    double Variable1 = 0.5;
    int Variable2 = 0;
    long Variable3 = 1;
    

    只要你宣告的时候,就要给他初始化一下。

    那阵列呢,当然也要啦!

    int Array1[6][7] = {0}; //这样子宣告的话就会每一项都是 0
    
  2. 先宣告一个 const,再宣告 array !

    例如我们要宣告一个长度为 10 的 array

    理论上我们要这麽做:

    首先要先 allocate a const.

    const int VALUE_LEN = 10;
    
    

    再来才是宣告array的长度

    float value[VALUE_LEN] = {0};
    

    这样的好处是,如果你今天要改阵列的长度,可以直接从宣告的 const 改,这样就不用每一项都要

    改改改改改了。

  3. 阵列不能互相宣告

    像是

    int a[5] = {0}; // RIGHT

    int b[5] = a; // WRONG

  4. 阵列不能比大小或是拿来做运算啦

    以上两点的原因,都是因为我们前天提到的: 我们所宣告的阵列只是一个位置,并不是一个值

    所以就不能拿来运算、比大小、或者宣告啦 !


心得

每次遇到回圈在乱搞的时候,其实慢慢的一圈一圈想,你的大脑可能会发展到不同层次。


<<:  Python - PyEnchant 英文单字拼写检查套件参考笔记

>>:  【Day 09】Hook 的奇妙冒险 - Ring3 Hook

制作婚礼现场即时留言版- Azure SignalR Service II

第12 届iT邦帮忙铁人赛系列文章 (Day29) 在上一篇我们用 Console App 发送讯息...

Spring Framework X Kotlin Day 13 Message Queue

GitHub Repo https://github.com/b2etw/Spring-Kotlin...

Dungeon Mizarka 022

Doc modification 今天又花了不少时间更新文件,主要是加入魔法的设定。为了要了解哪些魔...

D28 / Compose 可以用来做 Desktop App? - Compose JB

写到最後三天了,想要聊聊和 Android 不完全相关的东西。感谢JetBrains 的开发,和 K...

Day6-标头档2

最後就会形成下面这张图,左边工程师负责写类别并compile,右边负责写主程序并compiler,中...