一直以來,初始化變數和陣列常採用定義時賦值的方法,今天在定義乙個結構體的時候發現了一些問題,查了下相關資料發現以往的使用確實有些誤區,一直沒有注意到,於是蒐集了下零散的資料在此記錄一下。
1想必一直這樣使用也確實不會發現問題,按照慣性思維,把0換成1就是把全部元素初始化為1了!然而事實卻並非如此int a=0; /*
a初始化為0*/2
int b[10]=; /*
b中全部元素初始化為0
*/
,請看下面這段**↓
1 #include 2 #include 3這段程式的輸出結果如下↓4using
namespace
std;56
intmain()
7; /*
b中全部元素被初始化為1?
*/10 printf("
a=%d\n
",a);
11for(a=0;a<10;a++)
1215
return0;
16 }
1/*2可以看到,b陣列中的元素只有b[0]被初始化為了1,其餘元素依然為0。a=13
b[0]=1
4b[1]=0
5b[2]=0
6b[3]=0
7b[4]=0
8b[5]=0
9b[6]=0
10b[7]=0
11b[8]=0
12b[9]=0
13press any key to continue
14*/
通過查閱相關資料《the c++ programming language》,找到了以下內容:
5.2.1
陣列初始化
陣列可以用乙個列值來初始化,例如
1當陣列定義時沒有指定大小,當初始化採用列表初始化了,那麼陣列的大小由初始化時列表元素個數決定。所以v1和v2分別為 int[4] 和char[4]型別。如果明確指定了陣列大小,當在初始化時指定的元素個數超過這個大小就會產生錯誤!例如:int v1 =;
2char v2=;
1如果初始化時指定的的元素個數比陣列大小少,剩下的元素都回被初始化為 0 !char v3[2] =; //
錯誤:太多的初始化值了
2char v3[3] =; //
正確
例如:
1等價於int v5[8]=;
1注意沒有如下形式的陣列賦值:int v5[8]=;
1如果你想這樣的複製的話,請使用vector(16章第三節) 或者valarray(22章第四節)。void
f()2
; //
錯誤:不是陣列賦值
4 }
字元陣列可以方便地採用字串直接初始化(參考第五章 2.2小節)
譯註: 就是 這樣啦 char alpha ="abcdefghijklmn";
看完上述內容想必已經清楚的知道了陣列應該怎樣進行初始化了,此書在第六章還提及了結構體型別的的初始化問題,由於內容有過多重複,本文只列出重點。
什麼是 集合:顧名思義,集合(aggregate)就是多個事物聚集在一起,這個定義包括混合型別的集合:像struct和class等,陣列就是單一型別的集合。
1>為陣列各個元素指定初值:
12>如果給出的初始化值多於陣列元素的個數,編譯器就會給出一條出錯資訊。但如果給的初始化少於資料元素的個數,那將會怎麼樣呢?例如:int a[5]=;
1這時,編譯器會把第乙個初始化值賦給陣列的第乙個元素,然後用0賦給其餘的元素。注意,如果定義了乙個陣列而沒有給出一列初始值時,編譯器並不會去做初始化工作。所以上面的表示式是將乙個陣列初始化為零的簡潔方法,它不需要用乙個for迴圈,也避免了「偏移1位」錯誤(它可能比for迴圈更有效,這取決於編譯器)。int b[6] = ;
3>陣列還有一種叫自動計數(automatic counting)的快速初始化方法,就是讓編譯器按初始化值的個數去決定陣列的大小:
14>對於二維陣列,可以看做多個一維陣列組成的集合,使用用巢狀的大括號 ,,,…,} 來初始化其中的每個一維陣列,更高維陣列也是如此。int c[ ] = ;
1因為結構也是一種集合型別,所以它們也可以用同樣的方式初始化。int a[3][2]=,,};
1>定義乙個普通結構體型別x:
1使用x建立物件時,可以這樣初始化其每個成員的值:structx2
;
1 x x1 = ;使用x來建立物件陣列時,可以用巢狀的大括號 ,,,…,} 來初始化每乙個物件:
1 x x2[3] = , };這裡只列出了兩個物件的初值,所以第三個物件中的資料成員分別被初始化為對應資料型別的預設初值①
2>對於包含陣列的結構體來說,初始化與上述類似,需要說明的一點是,當陣列成員在結構體中定義在首位且給出不完全初始化表的情況下,初值是按照 陣列的元素順序 + 之後的成員表 依次被賦初值的,此處舉例說明:
1 #include 2 #include 3對於更複雜結構體也是如此,用{}逐級表明賦值關係即可。4using
namespace
std;56
structy7
;1213int
main()14;
16 y y[3] = ;
17 printf("
%d %d %f #%c#%d#\n
", yy.i[0], yy.i[1
], yy.f, yy.c, yy.c);
18/*
輸出結果:1 0 0.000000 # #0#
*/19 printf("
%d %d %f\n
", y[0].i[0], y[0].i[1], y[0
].f);
20/*
輸出結果:1 2 3.000000
*/21 printf("
%d %f #%d#\n
", y[2].i[0], y[2].f, y[2
].c);
22/*
輸出結果:0 0.000000 #0#
*/23
return0;
24 }
①各種資料型別的預設初值表
1資料型別 預設初始化值23
int0
4char
'\0x0'5
float
0.06
double
0.07
char array[n] ""
8int array[n]
陣列初始化
cpp中陣列初始化方法 簡單的初始化 利用定義變數時賦初值進行初始化。int a 10 float f 10 char ch 5 大括號中的為初始值。較為複雜的初始化 利用memset函式初始化。memset函式用法 void memset void s,int c,size t n 將已開闢記憶體...
陣列初始化
flydream flydream c cat x.cpp include using namespace std int main int argc,char argv flydream flydream c flydream flydream c g g wall x.cpp x.cpp in ...
陣列初始化
一 定義陣列 type arrayname 注 1 陣列定義 c語言宣告 時,不能指定陣列長度。2 定義只是在stack中指定了乙個引用變數,heap中未分配記憶體,所以要在初始化後才能使用。二 陣列初始化 1 靜態初始化 arrayname new type 或 arraynane 注 開發中習慣...