數組初始化
參考鏈接:C/C++數組初始化的一些誤區
1. 很容易出現的誤區:
int a[5] = { 0 }; // 全部初始化為0
int a[5] = { 1 }; // 我想全部初始化為1
上面初始化 1 的作法將會產生錯誤,而且你很可能想當然這么以為,從而導致耗費時間。如果真正理解數據初始化的原則,就不會犯錯了。數組初始化列表中的元素個數小於指定的數組長度時,不足的元素補以默認值。
對於基本類型int來說,當然就是補int()即0了。再看一下非基本類型的數組:
string a[5] = { "foo" };
等價於
string a[5] = { "foo", "", "", "", "" };
即后面4個元素調用了string的默認構造函數進行的初始化,而第一個則調用的string::string(const char*)進行的初始化。
2. memset 的誤區
注意:memset的使用有個大問題,就是它只對char類型的數組管用,因為memset的內部實現是以字節為單位進行賦值的,如果對int 類型(4個字節),數組內存連續,結果會如下
// 成功 char a[10]; memset(a, 1, 10); // 將每個元素設置為1 // 異常值 int a[10]; int a[10]; memset(a, 1, 10*sizeof(int)); for(int i = 0; i < 10; i++) cout << a[i] << endl; // 都被賦值為16843009,十六進制表示為0x01010101
指針和數組
參考鏈接:
6.14 — Pointers to pointers and dynamic multidimensional arrays
1. 一維數組
- 靜態 int array[100]; 定義了數組array,並未對數組進行初始化
- 靜態 int array[100] = {1,2}; 定義並初始化了數組array
- 動態 int* array = new int[100]; delete []array; 分配了長度為100的數組array
- 動態 int* array = new int[100]{1,2}; delete []array; 為長度為100的數組array初始化前兩個元素
2. 二維數組
- 靜態 int array[10][10]; 定義了數組,並未初始化
- 靜態 int array[10][10] = { {1,1} , {2,2} }; 數組初始化了array[0][0,1]及array[1][0,1]
- 動態 int (*array)[n] = new int[m][n]; delete []array; // in c++11: auto array = new int[m][n]
- 動態 int** array = new int*[m]; for(i) array[i] = new int[n]; for(i) delete []array[i]; delete []array; 多次析構
- 動態 int* array = new int[m*n]; delete []array; 數組按行存儲
- 注意這種方式不可用: int **array = new int[m][n];