1. 程式人生 > >C語言陣列的初始化

C語言陣列的初始化

一維陣列

其一般形式為:  型別名    陣列名    [陣列長度]     =     {初值表}

注:雖然C語言規定,只有靜態儲存的陣列才能初始化,但一般的C編譯系統都允許對動態儲存的陣列賦初值

對靜態陣列初始化:

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

若沒有對靜態陣列初始化,則系統會預設給其陣列元素賦初值0

static int a[5];
//等價於
static int a[5] = {0,0,0,0,0};

也可以只針對部分元素進行初始化:

static int a[5] = {0,1,2};
//等價於
static int a[5] = {0,1
,2,0,0};

但是如果不是靜態陣列,那麼陣列陣列元素的值就是不確定的了。(其實是多少與你用的編譯器有關,比如vc6.0會把它初始化位十六進位制數cc) 如:

int a[5] = {0,1,2};
//此陣列的前三個元素是確定的0,1,2。但無法確定後兩個元素

若對陣列的全部元素都賦了初值,則可以省略長度:

int a [] = {1,2,3,4,5,6,7,8,9,10};
//等價於
int a [10] = {1,2,3,4,5,6,7,8,9,10};

注:雖然這樣寫在編譯時不會報錯,但從程式的可讀性出發,不建議這樣寫。 不管有沒有對全部元素賦初值,都不應該省略陣列長度。

字元型陣列比較特殊,若賦的初值是一字串的話,會預設在結尾加 ‘\0’

char a[10] = "Hello";
//等價於
char a[10] = { 'H', 'e', 'l', 'l', 'o', '\0' };
//故此陣列長度為6個位元組
char a[10] = { 'H', 'e', 'l', 'l', 'o' };
//此陣列長度為5個位元組

字元陣列中的字串可以整體輸入輸出,用到%s,或gets(),puts()

動態初始化:

//迴圈賦值
int a[10];
int i;

for(i = 0 ; i < 10 ; i++){
    scanf("%d" , &a[i]);
}


----------
//gets()賦值
char a
[100]; int i; gets(a);

二維陣列

其一般形式為:  型別名    陣列名    [行長度]    [列長度]     =     {    {初值表0}    {初值表1}    {初值表2}    ……..}

int a [3][3] = { {1,2,3} , {4,5,6} , {7,8,9} };
//輸出樣式:
// 1  2  3
// 4  5  6
// 7  8  9

二維陣列也可以只對部分元素初始化:

static int a[3][3] = { {1,0,2} , {} , {3} };
//輸出樣式:
// 1  0  2
// 0  0  0
// 3  0  0
//等價於
static int a [3][3] = { {1,0,2} , {0,0,0} , {3,0,0} };

也可以直接賦初值,不用分行:

static int a [3][3] = { 1, 2, 3, 0, 0, 0, 4};
//輸出樣式:
// 1  2  3
// 0  0  0
// 4  0  0
//等價於
static int a [3][3] = { {1,2,3} , {0,0,0} , {4} };

同一維陣列一樣,二維陣列如果不是靜態陣列,那麼陣列陣列元素的值就是不確定的了

如果列出了全部元素,就可以省略行長度:

int a [][3] = { {1,2,3} , {4,5,6} , {7,8,9} };
//等價於
int a [][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9};
//等價於
int a [3][3] = { {1,2,3} , {4,5,6} , {7,8,9} };
//等價於
int a [3][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9};

注:一定不能省略列長度。 建議寫程式碼時都不要省略。

動態初始化:

//迴圈賦值
int a[10][10];
int i,j;

for(i = 0 ; i < 10 ; i++){
    for(j = 0 ; j < 10 ; j++){
        scanf("%d" , &a[i]][j]);
    }
}