C 基礎之陣列

2021-09-05 10:31:35 字數 3923 閱讀 5141

陣列(arrays) 是在記憶體中連續儲存的一組同種資料型別的元素(變數),每一陣列有乙個唯一名稱,通過在名稱後面加索引(index)的方式可以引用它的每乙個元素。

也就是說,例如我們有5個整型數值需要儲存,但我們不需要定義5個不同的變數名稱,而是用乙個陣列(array)來儲存這5個不同的數值。注意陣列中的元素必須是同一資料型別的,在這個例子中為整型(int)。

例如乙個儲存5個整數叫做billy的陣列可以用下圖來表示:

這裡每乙個空白框代表陣列的乙個元素,在這個例子中為乙個整數值。白框上面的數字0 到4 代表元素的索引(index)。注意無論陣列的長度如何,它的第乙個元素的索引總是從0開始的。

同其它的變數一樣, 陣列必須先被宣告然後才能被使用。一種典型的陣列宣告顯示如下:

type name [elements];
這裡type 是可以使任何一種有效的物件資料型別(object type),如 int, float…等,name 是乙個有效地變數標識(identifier),而由中括號引起來的elements 域指明陣列的大小,即可以儲存多少個元素。

因此,要定義上面圖中顯示的 billy 陣列,用一下語句就可以了:

int billy [5];
備註:在定義乙個陣列的時候,中括號中的elements 域必須是乙個常量數值,因為陣列是記憶體中一塊有固定大小的靜態空間,編譯器必須在編譯所有相關指令之前先能夠確定要給該陣列分配多少記憶體空間。

初始化陣列

當宣告乙個本地範圍內(在乙個函式內)的陣列時,除非我們特別指定,否則陣列將不會被初始化,因此它的內容在我們將數值儲存進去之前是不定的。

如果我們宣告乙個全域性陣列(在所有函式之外),則它的內容將被初始化為所有元素均為0。因此 ,如果全域性範圍內我們宣告:

int billy [5];
那麼billy 中的每乙個元素將會被初始化為0:

另外,我們還可以在宣告乙個變數的同時把初始值付給陣列中的每乙個元素,這個賦值用花括號來完成。例如:

int billy [5] = ;
這個宣告將生成如下陣列:

花括號中我們要初始化的元素數值個數必須和陣列宣告時方括號[ ]中指定的陣列長度相符。例如,在上面例子中陣列billy 宣告中的長度為5,因此在後面花括號中的初始值也有5個,每個元素乙個數值。

因為這是一種資訊的重複,因此c++允許在這種情況下陣列[ ]中為空白,而陣列的長度將有後面花括號{}中數值的個數來決定,如下例所示。

int billy  = ;
訪問陣列中數值在程式中我們可以讀取和修改陣列任一元素的數值,就像操作其他普通變數一樣。格式如下:

name[index]
繼續上面的例子,陣列billy 有5個元素,其中每一元素都是整型int,我們引用其中每乙個元素的名字分別為如下所示:

例如,要把數值75存入陣列billy 中第3個元素的語句可以是:

billy[2] = 75;
又例如,要把陣列billy 中第3個元素的值賦給變數a,我們可以這樣寫:

a = billy[2];
因此,在所有使用中,表示式billy[2]就像任何其他整型變數一樣。

注意陣列billy 的第3個元素為billy[2],因為索引(index)從0開始,第1個元素是billy[0],第2個元素是billy[1],因此第3個是 billy[2]。同樣的原因,最後乙個元素是billy[4]。如果我們寫billy[5],那麼是在使用billy的第6個元素,因此會超出陣列的長度。

在c++ 中對陣列使用超出範圍的index是合法的,這就會產生問題,因為它不會產生編譯錯誤而不易被察覺,但是在執行時會產生意想不到的結果,甚至導致嚴重執行錯誤。超出範圍的index 之所以合法的原因我們在後面學習指標(pointer)的時候會了解。

學到這裡,我們必須能夠清楚的了解方括號[ ]在對陣列操作中的兩種不同用法。它們完成兩種任務:一種是在宣告陣列的時候定義陣列的長度;另一種是在引用具體的陣列元素的時候指明乙個索引號(index)。我們要注意不要把這兩種用法混淆。

int billy[5]; // 宣告新陣列(以資料型別名稱開頭)

billy[2] = 75; // 儲存陣列的乙個元素

ps:

其它合法的陣列操作:

billy[0] = a; // a為乙個整型變數

billy[a] = 75;

b = billy [a+2];

billy[billy[a]] = billy[2] + 5;

|// arrays example

#include

int billy [ ] = ;

int n, result=0;

int main ()

cout << result;

return 0;

}輸出結果:12206

多維陣列多維陣列(multidimensional arrays)可以被描述為陣列的陣列。例如,乙個2維陣列(bidimensional array)可以被想象成乙個有同一資料型別的2維**。

jimmy 顯示了乙個整型(int )的3x5二維陣列,宣告這一陣列的的方式是:

int jimmy [3][5];
而引用這一陣列中第2列第4排元素的表示式為:jimmy[1][3]

(記住陣列的索引總是從0開始)。

多維陣列(multidimensional arrays)並不侷限於2維。如果需要,它可以有任意多維,雖然需要3維以上的時候並不多。但是考慮一下乙個有很多維的陣列所需要的記憶體空間,例如:

char century [100][365][24][60][60];

給乙個世紀中的每一秒賦乙個字元(char),那麼就是多於30億的字元!如果我們定義這樣乙個陣列,需要消耗3000m的記憶體。

多維陣列只是乙個抽象的概念,因為我們只需要把各個索引的乘積放入乙個簡單的陣列中就可以獲得同樣的結果。例如:

int jimmy [3][5];效果上等價於int jimmy [15];(3 * 5 = 15)

唯一的區別是編譯器幫我們記住每乙個想象中的維度的深度。下面的例子中我們就可以看到,兩段**乙個使用2維陣列,另乙個使用簡單陣列,都獲得同樣的結果,即都在記憶體中開闢了一塊叫做jimmy的空間,這個空間有15個連續位址位置,程式結束後都在相同的位置上儲存了相同的數值,如後面圖中所示:

// multidimensional array

#include

#define width 5

#define height 3

int jimmy [height][width];

int n,m;

int main ();

int b[5] = ;

int main()

輸出:

sizeof(a) = 8

sizeof(a[0]) = 4

sizeof(b) = 20

sizeof(b[2]) = 4

備註:int型佔4個位元組

C基礎之陣列

首先我們介紹多維陣列 對於二維陣列a 4 6 由於陣列名代表陣列的起始位址,所以a 第一層 和第乙個元素a 0 0 位址的數字是相同的,但是意義卻是不同的。對於該陣列我們可以理解為 a的一維陣列 第一層 它有四個元素a 0 a 1 a 2 a 3 第二層 而每個元素又含有6個元素a 0 0 a 0 ...

C 基礎之陣列

由於陣列是資料的集合,所以陣列的型別就是資料的型別。他們分別是int double decimal char string bool第一種int nums new int 10 長度為10,索引為0 9 int型別第二種int nums new int 此陣列就能存5個值第三種int nums ne...

C語言基礎之陣列

在c語言中,陣列屬於構造資料類。陣列元素可以是基本資料型別也可以是構造型別。一維陣列定義 型別識別符號 陣列名 常量表示式 例 int a 10 下標從0開始 陣列元素的表示式為 陣列名 下標 下標可以是整型常量或者表示式 陣列元素初始化 1.在定義陣列時賦初值 例 int a 10 2.給陣列部分...