iT邦幫忙

2023 iThome 鐵人賽

DAY 20
0

▌陣列簡介

具有相同的性質的東西把它集合放在一起,叫做「陣列/數組」,用 [] 來表示
一個陣列和一個變數一樣,有 類型 tpye、名稱 Array Name、值 Value 、資料長度 length 等屬性,但陣列還多了一種屬性 - 位址,它是有續性的,稱為「index索引 (計概中,也稱為「註標」),從 0 開始
https://ithelp.ithome.com.tw/upload/images/20231005/20149362mobwlZHK3U.png
圖片來源

▪ 一維陣列 & 多維陣列

在程式語言裡陣列的「邏輯順序」和「實體順序」是一樣的,在記憶體中,也是從 0, 1, 2... 由小到大排列。這樣的儲存方式是為了讓電腦可以很快的找出某一個 index 在記憶體中的位址,index的意義,是指相對於陣列中第一個元素的「位移量」,例如:指定存取 Array 中的第 4 個元素 = 指定存取 Array 中的第 1 個元素四個位移量的記憶體空間

那如果今天是「多維陣列」(Multidimensional Array)要怎麼辦?
多維陣列」就是陣列裡又包了陣列,像是二維陣列(2D Array/Two Dimensional Array)、三維陣列(Three-Dimensional Array)、N維陣列等,取值的方式,一維陣列使用一個 index 來選取某個特定的陣列元素;二維陣列則使用兩個索引值來指定某個特定的陣列元素,以 C 語言為例

// 一維陣列及其取值方式
int oneDimArray[5] = {1, 2, 3, 4, 5};
int value = oneDimArray[1];

//  二維陣列及其取值方式
int twoDimArray[3][4] = {
  {1, 2, 3, 4},
  {5, 6, 7, 8},
  {9, 10, 11, 12}
};

// 第一個 index 是用來指定存取哪一「列」,第二個是用來指定存取哪一「行」(直行橫列)
int value = twoDimArray[1][2];

通常系統在記憶體裡紀錄多維陣列位址的方法,是先把第一列的所有資料「連續」記錄在記憶體裡,接著紀錄第二列...以此類推,像是上方例子中的這個宣告 int twoDimArray[3][4],代表會配置 3 * 4 = 12 個整數的記憶體空間給此陣列使用。考試中有可能會問你某註標在記憶體中的哪裡,有公式可以直接套用,但非本文所要談論的範圍,如果不是要考試,有個基本概念就足夠惹~

在 C 語言裡,陣列會先存放好第一「列」的資料,接著第二列...子此類推,這樣的方式叫做「以列為主」(Row Major),有的程式語言是「以欄為主」(Column Major),這兩種方式的記憶體儲存位址會不太一樣,以下方這個 4(列)X 3(欄) 的二維陣列來舉例:
https://ithelp.ithome.com.tw/upload/images/20231005/201493625c2XwlUejf.png

「以列為主」的記憶體排序
https://ithelp.ithome.com.tw/upload/images/20231005/20149362n4oO93vdfV.png

「以欄為主」的記憶體排序
https://ithelp.ithome.com.tw/upload/images/20231005/20149362kq1aDZ3M6o.png

▌總結

「陣列」有以下特點:

  • 表示「有序串列」的一種方式
  • 佔用連續的記憶體空間
  • 各元素型態(type)皆需一致
  • 插入、刪除元素較為麻煩,因需挪移其它元素,所以不易動態增刪空間大小

▌參考資料

  1. [資料結構] Arrays
  2. 聯合大學 - 陳世杰教授 資料結構

上一篇
Day 19 | 網際網路及 IP 位址簡介
下一篇
Day 21 | 資料結構:鏈結串列(Linked List)
系列文
來場計概入門課吧X資訊人該了解的通識素養31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言