其實(shí),,只要記住一點(diǎn)就能很好區(qū)分char *和char []:char *定義的是一個(gè)指向字符串的指針(注意:C語言中沒有對應(yīng)字符串的內(nèi)置類型或者類類型),,而char []就是C語言中的用來定義字符數(shù)組(注意:字符數(shù)組是不同于字符串,,如果字符數(shù)組以'/0'結(jié)尾,那么可以視為字符串),。 (1)char str1[] = {'a', 'b', 'c'};//可以不用指定維數(shù),,如果這里指定就是char str1[3] 顯然,,str2可以視為字符串(以'/0'結(jié)尾),,而str1不是字符串。 如果用C函數(shù)庫中字符串處理函數(shù),,例如strlen函數(shù),,對于strlen(str1)則不能得到str1的正確長度,而strlen(str2)的返回值為3(不是維數(shù)4),。
(2)char *str1 = “abc”;//默認(rèn)會在結(jié)尾加上'/0'
(3)char str[] = {“abcd”};//可以不用指定維數(shù),如果這里指定就是char str[5],,默認(rèn)會在結(jié)尾加上'/0' 同char str[] = {'a', 'b', 'c', 'd', '/0'}一樣,。 如果字符串里有/0這樣的字符,那么可以寫成char *str4 = “abc//0”;使用雙斜線,,轉(zhuǎn)義字符的寫法,。
由上面可以知道,字符串可以是以'/0'結(jié)尾的字符數(shù)組,,也可以是字面常量字符串,,例如"abcdefg",把它的內(nèi)存地址賦給char *型的指針,。以上2種構(gòu)成的字符串,,即char []和char *在使用C語言庫函數(shù)時(shí),會有所不同,。
先簡要分析下面代碼 [cpp] view plaincopy
簡單調(diào)試一下,,就是知道第10行發(fā)生錯(cuò)誤,仔細(xì)想下str1指向了有20個(gè)字符空間的首地址,,而str2則指向字符串"abc"的首地址,,顯然使用strcat再添加字符串"def",則str2需要擴(kuò)充地址空間,,而這些地址空間沒有事先告訴程序,,當(dāng)然會出問題,。而str1事先分配了足夠的地址空間(可以放20個(gè)字符)。如果str1初始化時(shí)沒有分配足夠的大小,,那么第9行也會導(dǎo)致程序錯(cuò)誤,。 也可以這樣理解,str2指向常量字符串,,是不能再寫入的,。而str1指向的是以'/0'結(jié)尾的字符數(shù)組,可以寫入,,只要數(shù)組足夠大,。 如果char *型指針指向了字符數(shù)組,那么它和數(shù)組名都是指向同一塊內(nèi)存地址的指針,。代碼如下: [c-sharp] view plaincopy
這樣使用strcat(str2, “defg”);則沒有問題,。 另外,char[]只能在初始化時(shí),,才能這樣賦值:char str1[20] = “abc”;如下 [c-sharp] view plaincopy
注釋部分是str1不能再次以字符串的形式賦值(也不能以{'a', 'b', '/0'}形式賦值),,而str2則可以任意以字符串的形式再次賦值。
首次發(fā)文章,,希望能寫下去,! |
|