C++基礎 學習筆記六:複合類型之數組 什麼是數組 數組是有序的元素序列,是用於儲存多個相同類型數據的集合。 數組的定義 1. 聲明公式(一維) 1. 靜態數組 2. 動態數組 2. 關於數組的名詞解釋 1. 數組名 將有包含有限個類型相同的變數的集合命名,那麼這個集合的名稱為數組名。 2. 元素 ...
C++基礎 學習筆記六:複合類型之數組
什麼是數組
數組是有序的元素序列,是用於儲存多個相同類型數據的集合。
數組的定義
1. 聲明公式(一維)
1. 靜態數組
typeName arrayName[arraySize];
2. 動態數組
typeName* arrayName = new typeName[arraySize];
2. 關於數組的名詞解釋
-
數組名
將有包含有限個類型相同的變數的集合命名,那麼這個集合的名稱為數組名。
-
元素
組成數組的各個變數稱為數組的元素。
-
下標
數組的元素從第一個編號為0,依次往後按自然數序列排序。數組的各個元素的數字編號稱為下標。
-
長度
數組所包含的所有元素的數量稱為數組的長度。
-
大小
元素的大小 * 數組的長度 = 數組的大小
-
前驅
在長度為n的數組中
對於任何
0 ≤ i < j < n
,A[i]
都是A[j]
的前驅(predecessor)。特別地,對於任何
1 ≤ i
,A[i - 1]
稱作A[i]
的直接前驅(intermediate predecessor)。 -
後繼
在長度為n的數組中
對於任何
0 ≤ i < j < n
,A[j]
都是A[i]
的後繼(successor)。特別地,對於任何
i ≤ (n-2)
,A[i + 1]
稱作A[i]
的直接後繼(intermediate successor)。 -
首碼
任一元素的所有前驅構成其首碼(prefix)。
-
尾碼
任一元素的所有後繼構成其尾碼(suffix)。
-
物理地址
對於一維數組
A[n]
,每個元素占用s
個單位的空間,則元素A[i]
對應的物理地址為:A + i * s
。
數組的聲明、初始化與釋放
1. 聲明
1. 一維數組
-
靜態數組
int s_1dArray[2];
-
動態數組
int* d_1dArray = new int[2];
2. 二維數組
-
靜態數組
int s_2dArray[2][3];
-
動態數組
int** d_2dArray = new int*[2]; for(int i = 0; i < 2; i++) d_2dArray[i] = new int[3];
3. 三維數組
-
靜態數組
int s_3dArray[2][3][4];
-
動態數組
int*** d_3dArray = new int**[2]; for(int i = 0; i < 2; i++) { d_3dArray[i] = new int*[3]; for(int j = 0; j < 3; j++) d_3dArray[i][j] = new int[4]; }
關於聲明
-
靜態數組
[]
的值必須在編譯時是已知的,即不能為變數。 -
動態數組
[]
的值可以是變數。 -
特別的
[]
中的值可以為0。
2. 初始化
1. 一維數組
-
靜態數組
int s_1dArray_inited[2] = {1,2};
-
動態數組
int* d_1dArray_inited = new int[2]();
2. 二維數組
-
靜態數組
int s_2dArray_inited[2][3] = {{1,2,3},{4,5,6}};
-
動態數組
int** d_2dArray_inited = new int*[2]; for(int i = 0; i < 2; i++) d_2dArray_inited[i] = new int[3]();
3. 三位數組
-
靜態數組
int s_3dArray_inited[2][3][4] = {{{1,2,3,4},{5,6,7,8},{9,10,11,12}}, {{12,11,10,9},{8,7,6,5},{4,3,2,1}}};
-
動態數組
int*** d_3dArray_inited = new int**[2]; for(int i = 0; i < 2; i++) { d_3dArray_inited[i] = new int*[3]; for(int j = 0; j < 3; j++) d_3dArray_inited[i][j] = new int[4](); }
關於初始化
-
靜態數組
如果不主動初始化那麼基本類型數組中的數據則是“臟數據”,但是全局變數和靜態變數系統會將元素初始化為指定類型的預設值。特別的類類型會調用預設的構造函數,並且基本類型數組若初始化列表為空則系統會將元素初始化為元素的預設值。
當在初始化的序列中,如果序列中的值的數目小於數組的長度,那麼剩餘的元素會自動初始化為預設值。
-
動態數組
如果不主動初始化那麼數組中的數據則是“臟數據”。
3. 釋放
1. 一維數組
動態數組
delete[] s_1dArray;
2. 二維數組
動態數組
for(int i = 0; i < 2; i++)
delete[] d_2dArray[i];
3. 三維數組
動態數組
for(int i = 0; i < 2; i++)
{
for(int j = 0; j < 3; j++)
delete[] d_3dArray[i][j];
}
關於釋放
-
靜態數組
靜態數組分配在記憶體的棧里,在函數執行完以後,靜態數組會出棧銷毀。這是由系統自動完成的。
-
動態數組
動態分配的記憶體在堆上,系統無法自動釋放堆上的記憶體,需要主動釋放。
數組的使用例子
#include<iostream>
using namespace std;
int main()
{
int s_1dArray[2];
int* d_1dArray = new int[2];
int s_2dArray[2][3];
int** d_2dArray = new int*[2];
for(int i = 0; i < 2; i++)
d_2dArray[i] = new int[3];
int* s_3dArray[2][3][4];
int*** d_3dArray = new int**[2];
for(int i = 0; i < 2; i++)
{
d_3dArray[i] = new int*[3];
for(int j = 0; j < 3; j++)
d_3dArray[i][j] = new int[4];
}
delete[] s_1dArray;
for(int i = 0; i < 2; i++)
delete[] d_2dArray[i];
for(int i = 0; i < 2; i++)
{
for(int j = 0; j < 3; j++)
delete[] d_3dArray[i][j];
}
int s_1dArray_inited[2] = {1,2};
int* d_1dArray_inited = new int[2]();
int s_2dArray_inited[2][3] = {{1,2,3},{4,5,6}};
int** d_2dArray_inited = new int*[2];
for(int i = 0; i < 2; i++)
d_2dArray_inited[i] = new int[3]();
int s_3dArray_inited[2][3][4] = {{{1,2,3,4},{5,6,7,8},{9,10,11,12}},
{{12,11,10,9},{8,7,6,5},{4,3,2,1}}};
int*** d_3dArray_inited = new int**[2];
for(int i = 0; i < 2; i++)
{
d_3dArray_inited[i] = new int*[3];
for(int j = 0; j < 3; j++)
d_3dArray_inited[i][j] = new int[4]();
}
for(int i = 0; i < 2; i++)
cout << s_1dArray_inited[i] << " ";
cout << endl << endl;
for(int i = 0; i < 2; i++)
{
for(int j = 0; j < 3; j++)
cout << s_2dArray_inited[i][j] << " ";
cout << endl;
}
cout << endl;
for(int i = 0; i < 2; i++)
{
for(int j = 0; j < 3; j++)
{
for(int k = 0; k < 4; k++)
cout << s_3dArray_inited[i][j][k] << " ";
cout << endl;
}
}
return 0;
}
/* 運行結果為:
1 2
1 2 3
4 5 6
1 2 3 4
5 6 7 8
9 10 11 12
12 11 10 9
8 7 6 5
4 3 2 1
--------------------------------
Process exited after 0.5921 seconds with return value 0
請按任意鍵繼續. . .
*/