字元陣列的初始化,最容易理解的方式就是逐個字元賦給陣列中各元素。
charstr[10]={'I','','a','m','',‘h’,'a','p','p','y'};
即把10個字元分別賦給str[0]到str[9]10個元素
如果花括號中提供的字元個數大於陣列長度,則按語法錯誤處理;若小於陣列長度,則只將這些字元陣列中前面那些元素,其餘的元素自動定為空字元(即'\0')。
如char str[10] = {'\0'}; //結果裡面元素全都為\0.其實這樣賦值只是把第1個元素賦值為\0,後面的都預設用\0填充,如果是char str[10]={'1'};
只有第一個為‘1’,後面都是\0。但千萬不要以為寫成char str[10];不賦值也可以。這樣寫裡面的內容是錯的。
這是細節,值得注意。
所以我們最好每次想寫char str[5]都寫成
char str[5]='\0';
這樣做最好。
int a[10]={4,5};
第一個賦值為4,第二個為5,後面的為0.如果直接int a[10]; 內容很亂。
規律:用某個值給陣列賦值,沒有被賦值的元素會自動呼叫預設的建構函式,如char預設為\0,int預設為0.等等.
在 c語言中,將字串作為字元陣列來處理。(c 中不是)
在實際應用中人們關心的是有效字串的長度而不是字元陣列的長度,例如,
定義一個字元陣列長度為100,而實際有效字元只有40個,為了測定字串的實際長度,C語言規定了一個“字串結束標誌”,以字元'\0’代表。如果有一個字串,其中第10個字元為'\0',則此字串的有效字元為9個。也就是說,在遇到第一個字元'\0'時,表示字串結束,由它前面的字元組成字串。
系統對字串常量也自動加一個'\0'作為結束符。例如"C Program”共有9個字元,但在記憶體中佔10個位元組,最後一個位元組'\0'是系統自動加上的。(透過 sizeof()函式可驗證)
有了結束標誌'\0'後,字元陣列的長度就顯得不那麼重要了,在程式中往往依靠檢測'\0'的位置來判定字串是否結束,而不是根據陣列的長度來決定字串長度。當然,在定義字元陣列時應估計實際字串長度,保證陣列長度始終大於字串實際長度。(在實際字串定義中,常常並不指定陣列長度,如 char str[ ])
說明:'\n’代表 ASCII 碼為0的字元,從 ASCII碼錶中可以查到 ASCII 碼為0的字元不是一個可以顯示的字元,而是一個“空運算子”,即它什麼也不幹。用它來作為字串結束標誌不會產生附加的操作或增加有效字元,只起一個供辨別的標誌。
對C 語言處理字串的方法由以上的瞭解後,再對字元陣列初始化的方法補充一種方法——即可以用字串常量來初始化字元陣列:
注意sizeof與strlen的不同:
char a[40]={'0'};
printf("%d",sizeof(a));//開闢的陣列的總大小40*1
printf("%d",strlen(a));
輸出 40,1.
char str[ ]={"I am happy"}; 可以省略花括號,如下所示
char str[ ]="I am happy";
注意:上述這種字元陣列的整體賦值只能在字元陣列初始化時使用,不能用於字元陣列的賦值,字元陣列的賦值只能對其元素一一賦值,如:
char d[5];
d="hell";
錯誤。vs2010提示表示式d必須是可修改的左值。
這跟
int a[5]={1,2,3};
而不能
int a[5];
a={1,2,3}
陣列只能在初始化的時候一次性賦值,其他時候必須要一個一個賦值。
看來陣列名和指標是有區別的。
下面的賦值方法是錯誤的
char str[ ];
str="I am happy";
不是用單個字元作為初值,而是用一個字串(注意:字串的兩端是用雙引號“”而不是單引號‘’括起來的)作為初值。顯然,這種方法更直觀方便。(注意:陣列str的長度不是10,而是11,這點請務必記住,因為字串常量"I am happy"的最後由系統自動加上一個'\0')
因此,上面的初始化與下面的初始化等價
char str[ ]={'I',' ','a','m',' ','h','a','p','p','y','\0'};必須要人為加上一個\0,否則strlen不正確。
而不與下面的等價
char str[ ]={'I',' ','a','m',' ','h','a','p','p','y'};//strlen錯誤,後面沒有\0
前者的長度是11,後者的長度是10.
說明:字元陣列並不要求它的最後一個字元為'\0',甚至可以不包含'\0',像下面這樣寫是完全合法的。
char str[5]={'C','h','i','n','a'};
可見,用兩種不同方法初始化字元陣列後得到的陣列長度是不同的。
對字元陣列只能對各個元素賦值,不能用以下方法對字元陣列賦值
char str[14];
str="I love China"; (但在字元陣列初始化時可以,即 charstr[14]="I love China";)
而對字元指標變數,採用下面方法賦值:
char* a;
a="I love China";
或者是 char* a="I love China"; 都可以
對字元指標變數賦初值(初始化):
char* a="I love China";
等價於:
char* a
a="I love China";
而對於字元陣列的初始化
char str[14]="I love China";
不能等價於:
char str[14];
str="I love China"; (這種不是初始化,而是賦值,而對陣列這樣賦值是不對的)