最簡單的字元資料型別是 char 資料型別。該型別的變數只能容納乙個字元,而且在大多數系統上,只使用乙個位元組的記憶體。以下示例即宣告了乙個名為 letter 的 char 變數。請注意,這裡的字元常數就是賦給變數的值,要用單引號括起來。
char letter ='a';
下面的程式使用了乙個 char 變數和若干字元常數:
//this program uses a char variable and several character literals.
#include using namespace std;
int main()
程式輸出結果:
a
b
有趣的是,字元與整數密切相關,因為它們在內部其實是被儲存為整數。每個可列印的字元以及許多不可列印的字元都被分配乙個唯一的數字。用於編碼字元的最常見方法是 ascii(美國資訊交換標準**的首字母簡寫)。當字元儲存在記憶體中時,它實際上是儲存的數字**。當計算機被指示在螢幕上列印該值時,它將顯示與數字**對應的字元。
例如,數字 65 對應大寫字母 a,66 對應大寫字母 b,等等。下面的程式說明了字元之間的關係以及它們的儲存方式:
// this program demonstrates that characters are actually
// stored internally by their ascii integer value.
#include using namespace std;
int main()
程式輸出結果:
a
b
圖 1 進一步說明,當你認為儲存在記憶體中的是字元(如 a、b 和 c)時,實際上儲存的是數字 65、66 和 67。
字元常數和字串常數的區別
字元常數和 char 變數只能儲存乙個字元。如果要在常數或變數中儲存多個字元,則需要使用更複雜的字元資料型別 string(字串),字串常數和變數可以包含一系列的字元。
現在,讓我們先來認識一下字串常數,並將它們與字元常數進行一些比較。
在以下示例中,『h』 是字元常數,「hello」 是字串常數。請注意,字元常數用單引號括起來,而字串常數則用雙引號。
cout << 'h' << endl; //這顯示的是字元常數
cout << "hello" << endl; //這顯示的是字串常數
因為字串常數幾乎可以是任意長度,所以程式必須有一些方法知道它有多長。在 c++ 中,這是通過在其末尾附加乙個額外的位元組並將數字 0 儲存在其中來完成的。這被稱為 null 終止符或 null 字元,它標記著字串的結尾。
不要將空終止符與字元 『0』 混淆。字元 『0』 的 ascii 碼是 48,而空終止符的 ascii 碼是 0。如果要在螢幕上列印字元 0,則顯示的其實是 ascii 碼為 48 的字元;在使用字串常數或給字串變數賦值時,ascii **為 0 的字元將自動附加在其末尾。
現在來看乙個字串常數儲存在記憶體中的例子。圖 2 描述了字串 「sebastian」 的儲存方式。
首先,可以發現字串中的字元儲存在連續的記憶體位置。其次,可以看到引號不與字串一起儲存,它們只是在源**中標記字串的開頭和結尾。最後,請注意字串的最後乙個位元組,它包含 null 終止符,由 \0 字元表示。最後乙個位元組意味著雖然字串 「sebastian」 的長度為 9 個字元,但它實際占用了 10 個位元組的記憶體。
null 終止符是在後台默默奉獻的又乙個例子。在顯示字串時,它不會在螢幕上列印,但是它始終在那裡默默地做它的工作。需要注意的是,c++ 會自動在字串常數的末尾附加 null 終止符。
現在來比較一下字元和字串的儲存方式。假設程式中有常數 『a』 和 「a」。圖 3 顯示了其內部儲存方式。
如圖 3 所示,『a』 是乙個 1 位元組的元素,而 「a」 是乙個 2 位元組的元素。由於字元實際上被儲存為 ascii 碼,所以圖 4 顯示了它們在記憶體中實際儲存的內容。
因為 char 變數只能儲存乙個字元,所以它可以被賦值為字元 『a』,但不能被賦值為字串 「a」:
char letterone = 'a'; //該賦值語句正確
char lettertwo = "a"; //該賦值語句錯誤
注意,重要的是不要把字元常數和字串常數搞混。字元常數必須使用單引號括起來,而字串常數則必須使用雙引號。
現在應該已經了解,有些字串雖然看起來像是只有乙個字元,但實際上並不是。另外,也有一些字元看起來像是字串,例如換行符 \n,雖然它由兩個字元表示,乙個反斜槓和乙個控制字元 n,但是它在內部其實只表示乙個字元。事實上,所有的轉義序列在內部都只有 1 個位元組。
下面的程式顯示了 \n 作為字元常數的用法,用單引號括起來:
//this program uses character literals.
#include using namespace std;
int main()
程式輸出結果:
a
b
關於C 中char 型變數的位址輸出
在剛開始學習c c 過程中,我們希望輸出各個變數的位址來窺探一些我們 百思不得其解 的現象,例如搞清函式堆疊相關的程式內部秘密。先看下面示例 將原始碼中 修改為 我們看到同樣作為char型的變數m char2輸出位址正常,修改為 為什麼會出現這樣現象,字串是以空終止符 0 結尾的字元陣列,通過字串中...
關於字元型char變數
寫程式時,意外發現個很不容易察覺問題出在哪的問題的 scanf c ch scanf c c printf ch c n ch printf c c n c 如果輸入是 a b 那麼輸出會是 ch a c 問題出在哪?如果將 改為 scanf c ch scanf c c printf ch c n...
c 中關於char型變數與字串位址的輸出
參考至 在c裡面如果指標是乙個基本數值型 int foalt long等,如果輸出裡有 cout ptr endl 其中ptr是指標的名,則輸出的值是指標的位址,如果是char char指標 則輸出的是char指標的值。在c 中,熟悉int和char型的變數是最基本不過的了,不過,我想,很多初學者會...