在c語言程式設計中,當我們宣告乙個字串陣列的時候,常常需要把它初始化為空串。總結起來有以下三種方式:
第(1)(2)種方式是將str陣列的所有元素都初始化為'\0',而第(3)種方式是只將str陣列的第乙個元素初始化為'\0'。如果陣列的size非常大,那麼前兩種方式將會造成很大的開銷。
所以,除非必要(即我們需要將str陣列的所有元素都初始化為0的情況),我們都應該選用第(3)種方式來初始化字串陣列。
1. 基本問題
陣列可以初始化,即在定義時,使它包含程式馬上能使用的值。
例如,下面的**定義了乙個全域性陣列,並用一組fibonacci數初始化:
1初始化陣列的值的個數不能多於陣列元素個數,初始化陣列的值也不能通過跳過逗號的方式來省略,這在c中是允許的,但在c++中不允許。int iarray[10]=
例如,下面的**對陣列進行初始化是錯誤的:
1初始化值的個數可少於陣列元素個數。當初始化值的個數少於陣列元素個數時,前面的按序初始化相應值, 後面的初始化為0(全域性或靜態陣列)或為不確定值(區域性陣列)。int arrayl[5]=; //
error-初始化值個數多於陣列元素個數
2int array2[5]=; //
error:初始化值不能省略
3int array3[5]=; //
error:初始化值不能省略
4int array4[5]={}; //
error:語法格式錯誤
5void
main()
6
例如,下面的程式對陣列進行初始化:
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 長度...