關於數組、結構體的初始化{0}

關於數組、結構體的初始化

  一直以來,初始化變量和數組常採用定義時賦值的方法,今天在定義一個結構體的時候發現了一些問題,查了下相關資料發現以往的使用確實有些誤區,一直沒有注意到,因而蒐集了下零散的資料在此記錄一下。ios

1、以往經常使用的初始化方式:

1 int a=0;        /*a初始化爲0*/
2 int b[10]={0};    /*b中所有元素初始化爲0*/

想必一直這樣使用也確實不會發現問題,按照慣性思惟,把0換成1就是把所有元素初始化爲1了!然而事實卻並不是如此,請看下面這段代碼↓c#

 1 #include <iostream>
 2 #include <cstdio>
 3 
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     int a=1;        /*a初始化爲1*/
 9     int b[10]={1};    /*b中所有元素被初始化爲1?*/
10     printf("a=%d\n",a);
11     for(a=0;a<10;a++)
12     {
13         printf("b[%d]=%d\n",a,b[a]);
14     }
15     return 0;
16 }

這段程序的輸出結果以下↓數組

 1 /*
 2 a=1
 3 b[0]=1
 4 b[1]=0
 5 b[2]=0
 6 b[3]=0
 7 b[4]=0
 8 b[5]=0
 9 b[6]=0
10 b[7]=0
11 b[8]=0
12 b[9]=0
13 Press any key to continue
14 */

能夠看到,b數組中的元素只有b[0]被初始化爲了1,其他元素依然爲0。函數

 

經過查閱相關資料《The C++ Programming Language》,找到了如下內容:spa

5.2.1   數組初始化
數組能夠用一個列值來初始化,例如
code

1 int v1[] ={1,2,3,4};
2 char v2[]={'a','b','c',0};

當數組定義時沒有指定大小,當初始化採用列表初始化了,那麼數組的大小由初始化時列表元素個數決定。因此v1和v2分別爲 int[4] 和char[4]類型。若是明確指定了數組大小,當在初始化時指定的元素個數超過這個大小就會產生錯誤!例如:對象

1 char   v3[2] ={'a','b',0};   //錯誤:太多的初始化值了
2 char   v3[3] ={'a','b',0};   //正確

若是初始化時指定的的元素個數比數組大小少,剩下的元素都回被初始化爲 0 !blog

例如:字符串

1 int   v5[8]={1,2,3,4};

         等價於編譯器

1 int   v5[8]={1,2,3,4,0,0,0,0};

         注意沒有以下形式的數組賦值:

1 void f()
2 {
3     v4={'c','d',0};    //錯誤:不是數組賦值
4 }

若是你想這樣的複製的話,請使用 vector(16章第三節) 或者 valarray(22章第四節)。
  字符數組能夠方便地採用字符串直接初始化(參考第五章 2.2小節)
    譯註: 就是 這樣啦   char   alpha []="abcdefghijklmn";

看完上述內容想必已經清楚的知道了數組應該怎樣進行初始化了,此書在第六章還說起告終構體類型的的初始化問題,因爲內容有過多重複,本文只列出重點。

2、集合的初始化

什麼是 集合:顧名思義,集合(aggregate)就是多個事物彙集在一塊兒,這個定義包括混合類型的集合:像struct和class等,數組就是單一類型的集合。

 

一、常見數組即爲一種集合,此處作一個小總結:

1>爲數組各個元素指定初值:

1 int a[5]={ 1, 2, 3, 4, 5};

2>若是給出的初始化值多於數組元素的個數,編譯器就會給出一條出錯信息。但若是給的初始化少於數據元素的個數,那將會怎麼樣呢?例如:

1 int b[6] = {0};

這時,編譯器會把第一個初始化值賦給數組的第一個元素,而後用0賦給其他的元素。注意,若是定義了一個數組而沒有給出一列初始值時,編譯器並不會去作初始化工做。因此上面的表達式是將一個數組初始化爲零的簡潔方法,它不須要用一個for循環,也避免了「偏移1位」錯誤(它可能比for循環更有效,這取決於編譯器)。


3>數組還有一種叫自動計數(automatic counting)的快速初始化方法,就是讓編譯器按初始化值的個數去決定數組的大小:

1 int c[ ] = { 1, 2, 3, 4 };

4>對於二維數組,能夠看作多個一維數組組成的集合,使用用嵌套的大括號 {{a[0]},{a[1]},{a[2]},…,{a[n-1]}} 來初始化其中的每一個一維數組,更高維數組也是如此。

1 int a[3][2]={{1,1},{2,3},{3,6}};

  

2.關於struct關鍵字:
在C語言中,struct做爲結構體聲明的關鍵字,不具有C++中類的功能,而在C++中,struct與class均可用作類關鍵字,區別在於struct類默認public,class類默認private,所以此處只介紹C語言中struct結構體的相關內容,C++中struct類可參考class部分。

由於結構也是一種集合類型,因此它們也能夠用一樣的方式初始化。

1>定義一個普通結構體類型X:

1 struct X
2 {
3     int i;
4     float f;
5     char c;
6 };

 使用X建立對象時,能夠這樣初始化其每一個成員的值:

1 X x1 = { 12.2, 'c' };

使用X來建立對象數組時,能夠用嵌套的大括號 {{obj 1},{obj 2},{obj 3},…,{obj n}} 來初始化每個對象:

1 X x2[3] = { {1, 1.1, 'a'}, {2, 2.2, 'b'}};

這裏只列出了兩個對象的初值,因此第三個對象中的數據成員分別被初始化爲對應數據類型的缺省初值

 

2>對於包含數組的結構體來講,初始化與上述相似,須要說明的一點是,當數組成員在結構體中定義在首位且給出不徹底初始化表的狀況下,初值是按照 數組的元素順序 + 以後的成員表 依次被賦初值的,此處舉例說明:

 1 #include <iostream>
 2 #include <cstdio>
 3 
 4 using namespace std;
 5 
 6 struct Y
 7 {
 8     int i[2];
 9     float f;
10     char c;
11 };
12 
13 int main()
14 {
15     Y yy={1};
16     Y y[3] = {1,2,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     return 0;
24 }

對於更複雜結構體也是如此,用{}逐級代表賦值關係便可。

3.關於class

C++最主要的類的使用還用說嘛!!!不會的本身去看課本,去看構造函數靜態成員的相關內容!!!╭(╯^╰)╮

 

3、補充

①各類數據類型的缺省初值表

1 數據類型            缺省初始化值
2 
3 int                    0
4 char                '\0x0'
5 float                0.0
6 double                0.0
7 char Array[n]        ""
8 int Array[n]        {0,0,…,0}
相關文章
相關標籤/搜索