字串陣列初始化相關問題總結

2021-08-13 01:00:06 字數 3618 閱讀 9624

在c語言程式設計中,當我們宣告乙個字串陣列的時候,常常需要把它初始化為空串。總結起來有以下三種方式:

第(1)(2)種方式是將str陣列的所有元素都初始化為'\0',而第(3)種方式是只將str陣列的第乙個元素初始化為'\0'。如果陣列的size非常大,那麼前兩種方式將會造成很大的開銷。

所以,除非必要(即我們需要將str陣列的所有元素都初始化為0的情況),我們都應該選用第(3)種方式來初始化字串陣列。

1. 基本問題

陣列可以初始化,即在定義時,使它包含程式馬上能使用的值。

例如,下面的**定義了乙個全域性陣列,並用一組fibonacci數初始化:

1

int iarray[10]=

初始化陣列的值的個數不能多於陣列元素個數,初始化陣列的值也不能通過跳過逗號的方式來省略,這在c中是允許的,但在c++中不允許。

例如,下面的**對陣列進行初始化是錯誤的:

1       

int arrayl[5]=; //

error-初始化值個數多於陣列元素個數

2int array2[5]=; //

error:初始化值不能省略

3int array3[5]=; //

error:初始化值不能省略

4int array4[5]={}; //

error:語法格式錯誤

5void

main()

6

初始化值的個數可少於陣列元素個數。當初始化值的個數少於陣列元素個數時,前面的按序初始化相應值, 後面的初始化為0(全域性或靜態陣列)或為不確定值(區域性陣列)。

例如,下面的程式對陣列進行初始化:

1

//*********************2//

**   ch7_2.cpp  **3//

*********************

4     #include 5

6int array1[5]=;

7static

int array2[5]=;89

void

main()10;

12static

int arr2[5]=;

1314

intn;

15      cout <

global:\n";

16for(n=0; n<5; n++)

17        cout <

"<

1819      cout <

\nglobal static:\n";

20for(n=0; n<5; n++)

21        cout <

"<

2223      cout <

\nlocal:\n";

24for(n=0; n<5; n++)

25        cout <

"<

2627      cout <

\nlocal static:\n";

28for(n=0; n<5; n++)

29         cout <

"<

30      cout <

31     }

執行結果為:

global:

l  2  3  0  0

global static:

1  0  0  0  0

local:

2 23567 23567 23567 23567

local static:

1  2  0  0  0

例中,全域性陣列和全域性靜態陣列的初始化是在主函式執行之前完成的,而區域性陣列和區域性靜態陣列的初始化是在進入主函式後完成的。

全域性陣列arrayl[5]對於初始化表的值按序初始化為1,2,3,還有兩個元素的值則按預設初始化為0。

全域性靜態陣列array2[5]與全域性陣列的初始化情況一樣,初始化錶值(1)表示第1個元素的值,而不是指全部陣列元素都為1。

區域性陣列arrl[5]根據初始化錶值的內容按序初始化, 由於初始化錶值只有1個,所以還有4個元素的值為不確定。在這裡均為數值23567。

區域性靜態陣列arr2[5]先根據初始化表按序初始化,其餘3個陣列元素的值預設初始化為0。

2.初始化字元陣列

初始化字元陣列有兩種方法,一種是:

char array[10]=;

另一種是:

char array[10]=;

第一種方法用途較廣,初始化時,系統自動在陣列沒有填值的位置用,'\0'補上。另外, 這種方法中的花括號可以省略,即能表示成:

char array[10]="hello";

第二種方法一次乙個元素地初始化陣列,如同初始化整型陣列。這種方法通常用於輸入不容易在鍵盤上生成的那些不可見字元。

例如,下面的**中初始化值為若干製表符:

char charray[5]=;

編譯時必須知道陣列的大小。通常,宣告陣列時方括號內的數字決定了陣列的大小。有初始化的陣列定義又省略方括號中的陣列大小時,編譯器統計花括號之間的元素個數,以求出陣列的大小。

例如,下面的**產生相同的結果:

static int a1[5]=;

static int a2=;

讓編譯器得出初始化陣列的大小有幾個好處。它常常用於初始化乙個元素個數在初始化中確定的陣列,提供程式設計師修改元素個數的機會。

在沒有規定陣列大小的情況下,怎麼知道陣列的大小呢? sizeof操作解決了該問題。 例如,下面的**用sizeof確定陣列的大小:

1

//*********************2//

** ch7_3.cpp **3//

*********************

45     #include 6

7void

main()8;

10for(int i=0; i

11       cout

12      cout <

13     }

執行結果為:

1 2 4 8 16

sizeof操作使for迴圈自動調整次數。如果要從初始化a陣列的集合中增刪元素,只需重新編譯即可,其他內容無須更動。

每個陣列所佔的儲存量都可以用sizeof操作來確定! sizeof返回指定項的位元組數。sizeof常用於陣列,使**可在16位機器和32位機器之間移植:

對於字串的初始化,要注意陣列實際分配的空間大小是字串中字元個數加上末尾的,'\0',結束符。

例如,下面的**定義乙個字元陣列:

1

//*********************2//

**   ch7_4.cpp  **3//

*********************

45     #include 6

7void

main()

8

執行結果為:

size of array:12

size of string:ll

例中,陣列大小為12,而字串長度為11。

省略陣列大小只能在有初始化的陣列定義中。

例如,下面的**將產生乙個編譯錯誤:

int a;//error:沒有確定陣列大小

在定義陣列的場合,無論如何,編譯器必須知道陣列的大小。

字串陣列初始化相關問題總結

在c語言程式設計中,當我們宣告乙個字串陣列的時候,常常需要把它初始化為空串。總結起來有以下三種方式 第 1 2 種方式是將str陣列的所有元素都初始化為 0 而第 3 種方式是只將str陣列的第乙個元素初始化為 0 如果陣列的size非常大,那麼前兩種方式將會造成很大的開銷。所以,除非必要 即我們需...

字串陣列初始化

1 char arr 10 hi 初始化字串陣列時,編譯器自動將字串最後乙個字元後面加上 0 以表示字串的結束。如果陣列的大小大於字串的長度 1,那麼把字串結束後面的元素也都初始化為 0 看這段程式 定義乙個大小為12的字串陣列 char str1 12 jiajia 讓乙個char型的指標指向這個...

字串初始化與陣列越界問題。

string p1 abcd char p2 abcd char p3 abcd sizeof p3 5 字串結尾都有系統自動補 0 可用作判斷字串結束標誌 字元陣列和字串最明顯的區別就是字串會被預設的加上結束符 0 char p4 4 abcd 在定義時 系統提示字元太長編譯不通過。abcd 長度...