1. 程式人生 > >char *與char []的區別

char *與char []的區別

      其實,只要記住一點就能很好區分char *和char []:char *定義的是一個指向字串的指標(注意:C語言中沒有對應字串的內建型別或者類型別),而char []就是C語言中的用來定義字元陣列(注意:字元陣列是不同於字串,如果字元陣列以'/0'結尾,那麼可以視為字串)。
      分析如下

    (1)char str1[] = {'a', 'b', 'c'};//可以不用指定維數,如果這裡指定就是char str1[3]
            char str2[] = {'a', 'b', 'c', '/0'};//可以不用指定維數,如果這裡指定就是char str2[4]

      顯然,str2可以視為字串(以'/0'結尾),而str1不是字串。

      如果用C函式庫中字串處理函式,例如strlen函式,對於strlen(str1)則不能得到str1的正確長度,而strlen(str2)的返回值為3(不是維數4)。

   (2)char *str1 = “abc”;//預設會在結尾加上'/0'
           char *str2 = “abc/0”;//顯式加上'/0',跟上面其實一樣,沒有區別,strlen求的長度都為3
           char *str3 = “abc/0defg”;//printf輸出會忽略'/0'後面的字元,其實在編譯完時,str3中就只有字串abc,同樣strlen求的長度為3。

   (3)char str[] = {“abcd”};//可以不用指定維數,如果這裡指定就是char str[5],預設會在結尾加上'/0'

    同char str[] = {'a', 'b', 'c', 'd', '/0'}一樣。

    如果字串裡有/0這樣的字元,那麼可以寫成char *str4 = “abc//0”;使用雙斜線,轉義字元的寫法。

      由上面可以知道,字串可以是以'/0'結尾的字元陣列,也可以是字面常量字串,例如"abcdefg",把它的記憶體地址賦給char *型的指標。以上2種構成的字串,即char []和char *在使用C語言庫函式時,會有所不同。

先簡要分析下面程式碼

     簡單除錯一下,就是知道第10行發生錯誤,仔細想下str1指向了有20個字元空間的首地址,而str2則指向字串"abc"的首地址,顯然使用strcat再新增字串"def",則str2需要擴充地址空間,而這些地址空間沒有事先告訴程式,當然會出問題。而str1事先分配了足夠的地址空間(可以放20個字元)。如果str1初始化時沒有分配足夠的大小,那麼第9行也會導致程式錯誤。

     也可以這樣理解,str2指向常量字串,是不能再寫入的。而str1指向的是以'/0'結尾的字元陣列,可以寫入,只要陣列足夠大。

     如果char *型指標指向了字元陣列,那麼它和陣列名都是指向同一塊記憶體地址的指標。程式碼如下:

     這樣使用strcat(str2, “defg”);則沒有問題。

     另外,char[]只能在初始化時,才能這樣賦值:char str1[20] = “abc”;如下

     註釋部分是str1不能再次以字串的形式賦值(也不能以{'a', 'b', '/0'}形式賦值),而str2則可以任意以字串的形式再次賦值。

首次發文章,希望能寫下去!