1. 程式人生 > >陣列的定義、初始化及特點詳解

陣列的定義、初始化及特點詳解

陣列(Array),就是把有限個數據型別一樣的元素按順序放在一起,用一個變數命名,然後通過編號可以按順序訪問指定位置的元素的一個有序集合。

其實簡單來說,就是為了方便而把這些元素放在一起。我們通過編號去獲取每個元素,這個編號叫作下標或者索引(Index),一般的語言是從 0 開始的。

我們常說的陣列一般指一維陣列,當然還有多維陣列,雖然多維陣列並不常用。

多維的實現其實是陣列的某些元素本身也是一個數組,這裡以一個標準的二維陣列為例進行介紹。其實,二維陣列相當於每個元素的長度都一樣的一個一維陣列(也就是我們常說的陣列),和數學中的矩陣類似。

在很多弱語言中,並不要求每個元素的長度都一樣,可以某些元素是陣列(長度可以不一樣),某些元素不是陣列,甚至每個元素的資料型別都不同。這裡講的二維陣列指的是標準的二維陣列。

注:弱型別語言

也叫作弱型別定義語言,簡稱弱語言。弱語言一般對語言的標準沒有特別的要求。比如在 JavaScript 中用 var 宣告變數,不會指定該變數是哪種型別。強語言對編寫規則比較有要求,所以不容易出現問題,很多開發工具都會幫助檢查其基本規則。

在瞭解了什麼是陣列之後,我們來看下陣列的儲存結構。

陣列的儲存結構

首先我們來看下一維陣列的儲存結構,如圖 1 所示。

圖 1 陣列的儲存結構
其實,我們先要確定一個值,也就是陣列的長度;然後,系統會根據我們宣告的資料型別開闢一些空間(當然,每種資料型別需要開闢的空間也不一樣)。這時,這些空間就歸這個變數所有了。一般在程式語言的實現中,這些空間會預設對我們宣告的資料型別賦值,比如整型值是 0,布林值是 false,等等。

所以有以下幾種情況。
1) 只聲明瞭指定長度的空間,沒有初始化值(以整型為例,所有值都會預設為 0,如圖 2 所示)。

圖 2 在未初始化值時會預設初始化為 0
2) 聲明瞭指定長度的空間,初始化了部分值(以整型為例,未初始化的值都會預設為 0,如圖 3 所示)。


圖 3 只初始化了前三個值,其餘值自動初始化為 0
3) 聲明瞭指定長度的空間,初始化了全部的值,如圖 4 所示。

圖 4 初始化了全部的值

陣列在程式語言中的初始化及操作

在多數語言中,陣列的宣告都是非常簡單的,一般有下面幾種宣告方式(以 Java 語言、整型為例,其他語言、資料型別差異不大)。
int [] num1 = new int[10];
int [] num2 = {1,2,5};
num3[0]=1;
num3[1]=2;
num3[2]=5;
陣列指定位置的元素的值,是通過下標獲取的,下標在大部分語言中是從 0 開始的。
int [] num= {1,2,5};
int a = num[0];//a 的值為 1
int b = num[1];//b 的值為 2
為陣列賦值,和獲取元素的值類似,可以直接賦值。
int [] num = {1,2,5};
num[1] = 10;//現在 num 的陣列元素分別為 1,10,5
陣列常用的另一種方式是按順序訪問每一個值,一般通過程式語言中的迴圈語句實現(比如 for 迴圈)。
int [] num = {1,2,5};
for(int i = 0; i<num.length;i++){
    system.out.println(num[i]);
}
上面展示了迴圈列印陣列的值的程式碼,其中 num.length 可以獲取陣列的長度。細心的同學可以發現這個 length 後面沒有括號,是的,這個 length 是陣列的內建屬性(以 Java 為例,有些語言會同時提供兩種或更多的獲取陣列長度的方式)。

下面我們看下二維陣列的儲存結構,如圖 5 所示。

圖 5 二維陣列的儲存結構
二維陣列的初始化方式實際上和一維陣列沒有太大的區別,只不過我們需要提前確定第 1 維和第 2 維的長度。

在圖 5 中,第 1 維的長度為3,每維的元素又是一個長度為 6 的陣列。

多維陣列在程式語言中的初始化及操作

由於多維陣列與一維陣列的初始化及訪問區別不大,下面集中進行列舉。
int [][] num = new int[3][3];
int [][] num2 = {{1,2,3},{4,5,6},{7,8,9}};
int a = num2[1][0];//a 的值為 4
int b = num2[1].length;//b 的值為3,即第二維的長度
二維陣列的訪問方式其實和一維陣列和多維陣列的訪問方式沒什麼區別,我們只需要理解為陣列的元素也是個陣列。

陣列的特點

因為本身儲存的方式,陣列有如下特點。

1) 定長

陣列的長度是固定的,這是陣列最重要的一個特點。

只要我們在宣告時確定了陣列的長度,在賦值時就算沒有給陣列的所有元素賦值,未賦值的元素也是有初始預設值的;而如果我們在賦值時發現數組的長度不夠用,這時也沒有什麼好辦法,因為陣列的長度無法改變。要是想繼續存放資料,就只能重新宣告一個數組了。

2) 按順序訪問

我們在訪問一個數組中的某個元素時,必須從第 1 個元素開始按順序訪問,直到訪問到指定位置的元素。

這裡想說明一點,雖然我們在開發時可以直接通過下標訪問指定位置的元素,但是實際上計算機在處理時也是按順序訪問的。