字串常數,C語言字串常數詳解

2020-07-16 10:04:22
前面講過,字元常數是由一對單撇號括起來的單個字元,如 'a'、'D'、'?'、'$'。在 C 語言中,除了字元常數外還有字串常數,顧名思義就是多個“字元”串在一起。與字元常數有所不同,字串常數是用“雙撇號”括起來的多個字元的序列,如"How are you"、"I love you"、"你好"。當然,只要是“雙撇號”括起來的,就算只有一個字元也叫字串,如"a"。字元常數 'a'與字串常數"a"是不同的。

一個字元在記憶體中只佔一位元組,而字串本質上是多個字元組成的字元陣列。C語言規定,在每一個字串常數的結尾,系統都會自動加一個字元''作為該字串的“結束標誌符”,系統據此判斷字串是否結束。這裡要特別強調一點:''是系統自動加上的,不是人為新增的。

'' 是 ASCII 碼為 0 的字元,它不會引起任何控制動作,也不是一個可以顯示的字元。比如字串常數"CHINA",表面上看它只有 5 個字元,但實際上它在記憶體中占 6 位元組,'C'、'H'、'I'、'N'、'A'、'' 各佔一位元組。如果要輸出該字串,'' 不會輸出。也就是說,雖然實際上總共有 6 個字元,'' 也包括在其中,但輸出時 '' 不會輸出。系統從第一個字元 'C' 開始逐個輸出字元,直到遇到 '',則表示該字串結束,停止輸出。

也就是說,在字串常數中,如果“雙撇號”中能看見的字元有 n 個,那麼該字串在記憶體中所佔的記憶體空間為 n+1 位元組。

下面寫一個程式驗證一下:
# include <stdio.h>
int main(void)
{
    printf("%dx20", sizeof(""));
    printf("%dx20", sizeof("a"));
    printf("%dx20", sizeof("CHINA"));
    printf("%dx20", sizeof("How are you"));
    printf("%dx20", sizeof("I love you"));
    printf("%dn", sizeof("你好"));
    return 0;
}
輸出結果是:
1 2 6 12 11 5

第一個“雙撇號”中什麼都不寫,則只有 '' 一個字元,所以只佔一位元組。

第二個"a"中有 1 個可見字元,占 2 位元組。

第三個"CHINA"有 5 個可見字元,占 6 位元組。

第四個"How are you"中,空格也是字元,也算是可見的,所以總共有 11 個可見字元,共占 12 位元組。

第五個"I love you"共 10 個可見字元,占 11 位元組。

第六個"你好"為什麼佔 5 位元組?有 2 個可見字元不是應該佔3位元組嗎?C 語言規定,1 個英文字元佔 1 位元組,而 1個 中文字元佔 2 位元組,就算是中文的標點符號也是佔 2 位元組。所以兩個漢字占 4 位元組,加上 '' 總共是 5 位元組。

不能將一個字串常數賦給一個字元變數

為什麼不能將一個字串常數賦給一個字元變數?可以從兩個方面作出解釋:
  1. 前面講過,字元變數用 char 定義。一個字元變數中只能存放一個字元。而字串一般都有好多字元,占多位元組。所以不能將多個字元賦給只佔一位元組的變數。那麼如果字串常數的雙撇號內什麼都不寫,此時就只有一個字元 '',那麼此時可不可以將它賦給字元變數?不可以!原因看下面第二點。
  2. 字串是指一系列字元的組合。在 C 語言中,字元變數的型別用 char 定義。我們這裡講的是資料型別,但是字串不屬於資料型別,也就不存在字串變數。一種型別的變數要想儲存某個物件,必須能相容該物件的資料型別,而字串連資料型別都算不上,又怎麼能將它賦給字元變數呢?所以在 C 語言中,任何資料型別都不可以直接儲存一個字串。那麼字串如何儲存?在 C 語言中,字串有兩種儲存方式,一種是通過字元陣列儲存,另一種是通過字元指標儲存。

需要注意的是,雖然 C 語言裡面沒有資料型別可以儲存字串,但 C++ 和 Java 中都有。