1. 程式人生 > >字串常量與字串陣列

字串常量與字串陣列

其實這個問題已經遇到很多次了,每次都百度,當時都明白了,過一會就忘記了

現在暫時記錄整理一下,有時間作總結

首先,C語言沒有字串變數,只有字串常量,所以字串變數的任務就交給字元陣列解決了!

字串常量:"qwer"

嗯,這是一個字串常量,字串常量會在結尾加一個結束符'\0',所以這個字串常量的實際長度為5

字元陣列:char[5];

重點來了,這裡經常容易錯誤

1.首先,這個字串陣列的長度為5,這一定沒問題:從c[0]到c[4]。

2.然後,這其中字元陣列必須也有一個結束符號'\0',它在最後一個有意義的字元之後的一個位置(如果有意義的字元是2個的話,結束字元就在a[2]上,如果有意義的字元是3個的話,結束字元就在a[3]上)

3.理解了為什麼要有結束字元,接下來就是一些栗子了

1.char[5]={'q','w','e','r'}(正確寫法,末尾自動新增結束符)

2.char[5]={'q','w','e','r'.'t'};(錯誤寫法,編譯器不會報錯,輸出字串陣列名的時候結尾會有燙燙燙)

3.char[]={'q','w','e','r'};(錯誤寫法,編譯器不會報錯,輸出字串陣列名的時候結尾會有燙燙燙,因為並不知道字串的長度,無法推斷出結束符的位置,可以理解為編譯器不那麼智慧)

4.char[]={'q','w','e','r','\0'};(正確寫法,編譯器可以推斷出字串結束符號的位置)

5.char[5]="qwer";(正確寫法,末尾自動新增0)

6.char[5]={"qwer"}(正確寫法,末尾自動新增0)

7.char[5]="qwert"(正確寫法,末尾自動新增0)

8.char[5]={"qwert"}(錯誤寫法,編譯器會報錯)

9.char[]="qwer"(正確寫法,結尾自動添零,推斷出字串長度)

10.char[]={"qwer"}(正確寫法,結尾自動添零,推斷出字串長度)

11.char[5];

a[0]='q'

a[1]='w'

a[2]='e'

a[3]='r'

(錯誤寫法,編譯器不會報錯,輸出字串陣列名的時候結尾會有燙燙燙)

總結:經過以上分析可以看到

1雙引號的字串常量寫法是最好的

      1.除非算上結束符號之後超過了陣列長度,否則都是對的    

                 2.雙引號字串常量的寫法會自動新增結束符號,所以不要畫蛇添足,自己加結束符號,否則會超過長度)

2.單引號的寫法除了c[5]={‘q’,‘w’,‘e’}則這種既確定了長度,又留有足夠空間可以新增結束符號,並且還是採用的初始化列表初始化的,滿足這三個條件才才會自動新增0,除此之外不手動加0的全部是錯的!

3.strlen()函式求得是不帶'/0'結束符號的字母長度,如果沒有遇到結束符號,那麼求出的長度肯定大於得到的長度

4.關於字元陣列,字串常量和“指向字串的指標”

    char p1[]="abcde";

  char *p2=“abcde”

  p1是字元陣列,"abcde"是字串常量

      p2是"指向字串的指標"

     char p1[5]; p1="abcde";//這種寫法是錯誤的!,因為陣列型別的資料必須初始化,並且不允許直接賦值

     char  *p2;p2="abcde";//這種寫法是對的(全域性變數,內建型別:包括基本和複合),因為是個指標變數 ,而不是陣列,p2可直接訪問文字常量區

   char c='c';   

  另外 char*p3=&c也是可行的