C++ 數組初始化與指針


數組初始化

參考鏈接: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

指針和數組

參考鏈接:

C++中數組定義及初始化

6.14 — Pointers to pointers and dynamic multidimensional arrays

1. 一維數組

  1. 靜態 int array[100];   定義了數組array,並未對數組進行初始化
  2. 靜態 int array[100] = {1,2};  定義並初始化了數組array
  3. 動態 int* array = new int[100];  delete []array;  分配了長度為100的數組array 
  4. 動態 int* array = new int[100]{1,2};  delete []array; 為長度為100的數組array初始化前兩個元素

2. 二維數組

  1. 靜態 int array[10][10];  定義了數組,並未初始化
  2. 靜態 int array[10][10] = { {1,1} , {2,2} };  數組初始化了array[0][0,1]及array[1][0,1]
  3. 動態 int (*array)[n] = new int[m][n]; delete []array;  // in c++11: auto array = new int[m][n]
  4. 動態 int** array = new int*[m]; for(i) array[i] = new int[n];  for(i) delete []array[i]; delete []array;    多次析構
  5. 動態 int* array = new int[m*n];  delete []array;      數組按行存儲
  6. 注意這種方式不可用: int **array = new int[m][n];


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM