1. 程式人生 > 其它 >內建型別——陣列array

內建型別——陣列array

一、介紹

內建型別

類似於標準庫vector,也是存放型別相同物件的順序容器。

不同的地方:陣列的大小確定不變,不能隨意向陣列中增加元素,不夠靈活。

注意:如果不清楚元素的確切個數,請使用vector

二、定義和初始化內建陣列

宣告形如 a[d],其中a是陣列的名字,d是陣列的維度。

維度說明了陣列中元素的個數,因此必須大於0。

維度必須是一個常量表達式。

unsigned cnt = 42;				// 不是常量表達式
constexpr unsigned sz = 42;		// 常量表達式
int arr[10];					// 含有10個整數的陣列
int *parr[sz];					// 含有42個整型指標的陣列
string bad[cnt];				// 錯誤:cnt不是常量表達式
string strs[get_size()];		// 當get_size()是常量表達式時正確, 否則錯誤
顯式初始化陣列元素
const unsigned sz = 3;
int ial[sz] = {0, 1, 2};		// 含有3個元素的陣列,元素值分別是 0, 1, 2
int a2[] = {0, 1, 2};			// 維度是3的陣列
int a3[5] = {0, 1, 2};			// 等價於 a3[] = {0, 1, 2, 0, 0}
string a4[3] = {"hi", "bye"};	// 等價於 a4[] = {"hi", "bye", ""}
不允許拷貝和賦值

不能將陣列的內容拷貝給其他陣列作為其初始值,也不能用陣列為其他陣列賦值:

int a[] = {0, 1, 2};		// 含有3個整數的陣列
int a2[] = a;				// 錯誤: 不允許使用一個數組初始化另一個數組
a2 = a;						// 錯誤: 不能把一個數組直接賦值給另一個數組

三、訪問陣列元素

類似於stringvector,陣列的元素也能使用範圍for語句或下標運算子來訪問。

在使用陣列下標的時候,通常將其定義為size_t型別。size_t 是一種機器相關的無符號型別,它被設計得足夠大以便能夠表示在記憶體中任意物件的大小。

cstddef標頭檔案中定義了size_t型別,這個檔案是C標準庫stddef.h標頭檔案的C++語言版本。

unsigned scores[11] = {};		// 11 個分數段,全部初始化為0
for (auto score : scores) {
    cout << i << " ";			// 輸出當前的計數值
}

四、指標與陣列

使用陣列的時候,編譯器一般會把它轉換成指標。

通常情況下,使用取地址符&來獲取指向某個物件的指標。

在很多用到陣列名字的地方,編譯器都會自動地將其替換為一個指向陣列首元素的指標:

string nums[] = {"one", "two", "three"};
string *p2 = nums;		// 等價於p2 = &nums[0]
使用指標遍歷陣列元素
int arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int *e = &arr[10];		// 指向arr尾元素的下一位置的指標
// 注意:指標也是迭代器
for (int *b = arr; b != e; ++b) {
    cout << *b << endl;	// 輸出arr的元素
}
標準庫函式beginend
int ia[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int *beg = begin(ia);		// 指向ia首元素的指標
int *last = end(ia);		// 指向arr尾元素的下一位置的指標

beginend這兩個函式定義在iterator標頭檔案中

特別注意:尾後指標不能執行解引用和遞增操作。