資料結構/陣列
陣列是一種集合,主要由類似的資料型別組成,儲存在一個公共變數中。該集合構成一個數據結構,其中物件以線性方式儲存,一個接一個地儲存在記憶體中。有時陣列甚至會被複制到記憶體硬體中。
該結構也可以定義為儲存索引資料的元素的特定方法。資料元素在陣列中以塊的形式邏輯上按順序儲存。每個元素都透過一個索引或下標來引用。
索引通常是一個用於定址陣列中元素的數字。例如,如果你要儲存關於八月份每一天的資訊,你會建立一個索引能夠定址 31 個值的陣列——八月份每個日期對應一個值。索引規則依賴於語言,但是大多數語言使用 0 或 1 作為陣列的第一個元素。
對於初學者來說,陣列的概念可能令人望而生畏,但實際上它非常簡單。想象一本從 1 到 12 編頁的筆記本。每個頁面可能包含或不包含資訊。筆記本是一個包含頁面的陣列。每個頁面都是'筆記本'陣列的元素。在程式設計中,你會透過引用頁面的編號或下標來檢索頁面上的資訊,例如,notebook(4) 將引用陣列 notebook 中第 4 頁的內容。
筆記本(陣列)包含 12 頁(元素)
陣列也可以是多維的——而不是訪問一維列表的元素,元素可以透過兩個或多個索引訪問,例如矩陣或張量。
多維陣列就像我們上面提到的筆記本示例一樣簡單。要想象一個多維陣列,可以考慮一個日曆。日曆的每一頁,從 1 到 12,是一個元素,代表一個月,包含大約 30 個元素,代表天數。每一天可能包含或不包含資訊。然後在程式設計中,calendar(4,15) 將引用第 4 個月第 15 天。因此我們有一個二維陣列。要想象一個三維陣列,可以將每一天分成 24 個小時。現在 calendar(4,15,9) 將引用第 4 個月第 15 天第 9 小時。

一個簡單的 6 行 4 列陣列
Array<Element> 操作
make-array(整數 n): 陣列
- 建立一個索引從 到 (包含)的元素的陣列。陣列中元素的數量,也稱為陣列的大小,是 n。
get-value-at(Array a, 整數 index): 元素
- 返回給定index處的元素的值。index的值必須在範圍內:0 <= index <= (n - 1)。此操作也稱為下標。
set-value-at(Array a, 整數 index, 元素 new-value)
- 將陣列中給定index處的元素設定為等於new-value。
陣列保證恆定時間讀寫訪問,,但是元素例項的許多查詢操作(find_min、find_max、find_index)是線性時間,。陣列在大多數語言中非常有效,因為操作透過基於陣列的基地址元素的簡單公式計算元素的地址。
陣列的實現方式在不同語言之間存在很大差異:一些語言允許陣列自動調整大小,甚至包含不同型別的元素(如 Perl)。其他語言則非常嚴格,要求在執行時知道陣列的型別和長度資訊(如 C)。
陣列通常直接對映到計算機記憶體中的連續儲存位置,因此是大多數高階語言的“自然”儲存結構。
簡單的線性陣列是大多數其他資料結構的基礎。許多語言不允許你分配除了陣列以外的任何結構,所有其他結構必須在陣列之上實現。唯一的例外是連結串列,它通常實現為單獨分配的物件,但也可以在陣列中實現連結串列。
陣列索引需要某種型別。通常,使用該語言的標準整數型別,但也有像 Ada 和 Pascal 這樣的語言,允許任何離散型別作為陣列索引。指令碼語言通常允許任何型別作為索引(關聯陣列)。
陣列索引由一個具有下界和上界的數值範圍組成。
在一些程式語言中,只有上界可以選擇,而下界固定為 0 (C、C++、C#、Java) 或 1 (FORTRAN 66、R)。
在其他程式語言中 (Ada、PL/I、Pascal),下界和上界都可以自由選擇 (甚至可以為負數)。
陣列索引的第三個方面是檢查有效範圍以及訪問無效索引時會發生什麼。這是一個非常重要的點,因為大多數 計算機蠕蟲 和 計算機病毒 都是透過使用無效的陣列邊界來攻擊的。
有三種選擇
- 大多數語言 (Ada、PL/I、Pascal、Java、C#) 將檢查邊界,並在訪問不存在的元素時引發某種錯誤條件。
- 少數語言 (C、C++) 不會檢查邊界,並在訪問超出有效範圍的元素時返回或設定某個任意值。
- 指令碼語言通常在將資料寫入之前無效的索引時自動擴充套件陣列。
陣列型別的宣告取決於特定語言中陣列具有的特性數量。
最簡單的宣告是在語言具有固定下界和固定索引型別的情況下。如果需要一個數組來儲存月收入,可以在 C 中宣告
typedef double Income[12];
這將提供一個範圍為 0 到 11 的陣列。有關 C 中陣列的完整描述,請參閱 C 程式設計/陣列。
如果使用的是可以同時選擇下界和索引型別的語言,那麼聲明當然會更加複雜。以下是在 Ada 中的兩個示例
type Month is range 1 .. 12;
type Income is array(Month) of Float;
或更短的
type Income is array(1 .. 12) of Float;
有關 Ada 中陣列的完整描述,請參閱 Ada 程式設計/型別/陣列。
我們通常使用名稱、後跟括號(方括號“[]”或圓括號“()”)中的索引來寫陣列。例如,August[3]是 C 程式語言中用來引用一個月中特定日期的方法。
因為 C 語言從零開始索引,August[3]是陣列中的第 4 個元素。august[0]實際上引用的是該陣列的第一個元素。從零開始索引對於計算機來說是自然的,因為它們的內部數字表示從零開始,但對於人類來說,這種非自然的編號系統在訪問陣列中的資料時會導致問題。在使用基於零索引的語言獲取元素時,請牢記陣列的實際長度,以免獲取錯誤的資料。這是在使用具有固定下界的語言程式設計時的缺點,程式設計師必須始終記住“[0]”表示“第一個”,並在需要時新增或減去 1。具有可變下界的語言將減輕程式設計師的負擔。
我們使用索引來儲存相關資料。如果我們的 C 語言陣列名為august,並且我們希望儲存我們將在第一天去超市的資訊,我們可以說,例如
august[0] = "Going to the shops today"
這樣,我們可以遍歷索引 0 到 30,獲取每個日期的相應任務。august.