1. 很容易出現的誤區:
int a[5] = ; // 全部初始化為0int a[5] = ; //
我想全部初始化為1
上面初始化 1 的作法將會產生錯誤,而且你很可能想當然這麼以為,從而導致耗費時間。如果真正理解資料初始化的原則,就不會犯錯了。陣列初始化列表中的元素個數小於指定的陣列長度時,不足的元素補以預設值。
對於基本型別int來說,當然就是補int()即0了。再看一下非基本型別的陣列:
string a[5] = ;
等價於
string a[5] = ;
即後面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. 一維陣列
靜態 int array[100]; 定義了陣列array,並未對陣列進行初始化
靜態 int array[100] = ; 定義並初始化了陣列array
動態 int* array = new int[100]; delete array; 分配了長度為100的陣列array
動態 int* array = new int[100]; delete array; 為長度為100的陣列array初始化前兩個元素
2. 二維陣列
靜態 int array[10][10]; 定義了陣列,並未初始化
靜態 int array[10][10] = , }; 陣列初始化了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];
C 陣列(初始化陣列,陣列邊界,陣列與指標)
陣列由資料型別相同的一系列元素組成。陣列元素按順序儲存在記憶體中,通過整數下標subscript 或索引index 可以訪問各元素。c把陣列看作是派生型別,因為陣列是建立在其他型別的基礎上。int powers 8 從ansi c開始支援這種初始化 以逗號分隔的值列表 用花括號括起來 來初始化陣列,...
C語言 陣列指標初始化
char m 3 4 m 3 4 當然不行,不管從初始化器,還是從原理上來講都不正確,首先a 3 4 表示的是陣列中第4行第5個元素,請問,可以對陣列中具體的乙個元素賦這麼長一串值嗎?所以不能這樣賦值。第一種寫法是屬於初始化,初始化會自動為陣列中的每乙個元素賦正確的值。陣列指標初始化方法 int p...
指標陣列的初始化!
const char strings 7 這是宣告時初始化的清況,如果先宣告,在初始化呢?我想當然的寫成 const char strings 7 strings 我不知道問題出在哪兒,基礎不牢啊。所以在研究一下指標陣列的初始化。上面 const char strings 7 宣告了乙個指標陣列,它...