c語言里char什麼意思
❶ C語言中char表示什麼
char是字元類型,整型的一種
一般是一個位元組存儲
❷ c中的char主要是干什麼的,要詳細
C語言基本類型:字元型(char)用法介紹
1.字元型(char)簡介
字元型(char)用於儲存字元(character),如英文字母或標點。嚴格來說,char 其實也是整數類型(integer type),因為 char 類型儲存的實際上是整數,而不是字元。計算機使用特定的整數編碼來表示特定的字元。美國普遍使用的編碼是 ASCII(American Standard Code for Information Interchange 美國信息交換標准編碼)。例如:ASCII 使用 65 來代表大寫字母 A,因此存儲字母 A 實際上存儲的是整數65。注意:許多IBM大型機使用另一種編碼——EBCDIC(Extended Binary-Coded Decimal Interchange Code 擴充的二進制編碼的十進制交換碼);不同國家的計算機使用的編碼可能完全不同。
ASCII 的范圍是 0 到 127,故而 7 位(bit)就足以表示全部 ASCII。char 一般佔用 8 位內存單元,表示ASCII綽綽有餘。許多系統都提供擴展ASCII(Extended ASCII),並且所需空間仍然在 8 位以內。注意,不同的系統提供的擴展 ASCII 的編碼方式可能有所不同!
許多字元集超出了 8 位所能表示的范圍(例如漢字字元集),使用這種字元集作為基本字元集的系統中,char 可能是 16 位的,甚至可能是 32 位的。總之,C 保證 char 佔用空間的大小足以儲存系統所用的基本字元集的編碼。C 語言定義一個位元組(byte)的位數為 char 的位數,所以一個位元組可能是 16 位,也可能是 32 位,而不僅僅限於 8 位。
2. 聲明字元型變數
字元型變數的聲明方式和其它類型變數的聲明方式一樣:
char good;
char better, best;
以上代碼聲明了三個字元型變數:good、better,和 best。
3. 字元常量與初始化
我們可以使用以下語句來初始化字元型變數:
charch = 'A';
這個語句把ch的值初始化為 A 的編碼值。在這個語句中,'A' 是字元常量。C 語言中,使用單引號把字元引起來就構成字元常量。我們來看另外一個例子:
char fail; /* 聲明一個字元型變數 */ fail = 'F'; /* 正確 */ fail = "F"; /* 錯!"F" 是字元串字面量 */
把字元用雙引號引起來構成字元串字面量,所以第三個語句是錯誤的。我們會在後續的教程中討論字元串,現在暫且把它放下。
因為字元實質上是以數字的形式存儲的,所以我們可以直接使用數字來初始化字元變數,或者給字元變數賦值:
char ch = 65; /* 不好的風格 */
在 ASCII 中,A 的編碼是 65,所以對於使用 ASCII 的系統來說,這個語句等同於 char ch = 'A';。使用非 ASCII 的系統中,65 代表的不一定是 A,而有可能是其它任何字元,所以使用數字來初始化字元變數,或者給字元變數賦值是一種不好的風格,因為移植性太差了!但是,使用字元常量(例如 'A')來初始化字元變數,或者給字元變數賦值,字元變數得到的一定是我們所期待的字元的編碼值。例如:
charch = 'A';
無論在使用任何編碼的系統中,ch都能夠得到字元 A 所對應的編碼值。這是因為編譯器會自動把 'A' 轉化成 A 所對應的編碼值。因此,我們應該使用字元常量來初始化字元變數,或者給字元變數賦值;而不要用數字。
有趣的是,C 使用int類型來處理字元常量,而不是 char 類型。例如,在使用32位int的ASCII 系統中,以下代碼
charch = 'C';
'C' 的編碼值 67 被存儲於 32 位的內存單元中;不過ch仍然存儲於 8 位的內存單元中,只是它的值變成了 67。因此,我們可以定義形如 'good' 的古怪字元常量。因為每個字元的編碼值佔用 8 位的內存單元,所以這個常量剛好可以存儲於 32 位的內存單元。然而,用這種字元常量初始化字元變數,或者給字元變數賦值的話,導致的結果是,字元變數只能得到字元常量的最後 8 位。也就是說,以下代碼
charch = 'good';
ch得到的是 'd' 的值。
以後,在沒有特殊說明的情況下,我們討論的都是 ASCII。 ASCII值
控制字元 ASCII值控制字元 ASCII值控制字元 ASCII值控制字元 0 NUL 32 (space) 64 @ 96 ` 1 SOH 33 ! 65 A 97 a 2 STX 34 " 66 B 98 b 3 ETX 35 # 67 C 99 c 4 EOT 36 $ 68 D 100 d5 ENQ 37 % 69 E 101 e 6 ACK 38 & 70 F 102 f 7 BEL 39 ' 71 G 103 g 8 BS 40 ( 72 H 104 h 9 HT 41 ) 73 I 105 i 10 LF 42 * 74 J 106 j 11 VT 43 + 75 K 107 k 12 FF 44 , 76 L 108 l 13 CR 45 - 77 M 109 m 14 SO 46 . 78 N 110 n 15 SI 47 / 79 O 111 o 16 DLE 48 0 80 P 112 p 17 DC1 49 1 81 Q 113 q 18 DC2 50 2 82 R 114 r 19 DC3 51 3 83 S 115 s 20 DC4 52 4 84 T 116 t 21 NAK 53 5 85 U 117 u 22 SYN 54 6 86 V 118 v 23 ETB 55 7 87 W 119 w 24 CAN 56 8 88 X 120 x 25 EM 57 9 89 Y 121 y 26 SUB 58 : 90 Z 122 z 27 ESC 59 91 [ 123 { 28 FS 60 < 92 \ 124 | 29 GS 61 = 93 ] 125 } 30 RS 62 > 94 ^ 126 ~ 31 US 63 ? 95 _ 127 DEL
NUL 空字元 VT 垂直製表 SYN 同步
SOH 標題開始 FF 走紙控制 ETB 信息組傳送結束
STX 正文開始 CR 回車 CAN 作廢
ETX 正文結束 SO 移位輸出 EM 媒介結束 End of Medium EOT 傳輸結束 SI 移位輸入 SUB 換置
ENQ 詢問字元 DLE Data Link Escape ESC Escape ACK 確認 DC1 設備控制1 FS 文件分隔符 BEL 響鈴 DC2 設備控制2 GS 組分隔符 BS 退格 DC3 設備控制3 RS 記錄分隔符 HT 橫向製表 DC4 設備控制4 US 單元分隔符 LF 換行 NAK 否定 DEL 刪除4.不可列印字元(Nonprinting Characters)
有些 ASCII 字元是不可列印的。例如退格、另起一行、警報等。C 語言提供了兩種方法來表示這種不可列印字元。
第一種方法是使用 ASCII 編碼。例如,ASCII 編碼中,7 用於表示警報:
char beep = 7;
第二種方法是使用特殊符號序列,也就是所謂的轉義字元escape sequences)。參見下表:(
轉義字元含義
\a 警報( Alert (ANSI C) ) \b 退格(Backspace) \f 換頁(Form feed)
換行(Newline)
回車(Carriage return)
\t 水平製表符(Horizontal tab) \v 垂直製表符(Vertical tab) \\ 反斜桿( Backslash (\) )
\' 單引號( Single quote (') ) \" 雙引號( Double quote (") ) \? 問號( Question mark (?) )
\0oo 八進制數( Octal value (o 代表一個八進制數字) ) \xhh十六進制數( Hexadecimal value (h 代表一個十六進制數字) )
給變數賦值的時候,轉義字元必須使用單引號引住。例如:
charnl = ' ';
下面我們詳細學習每個轉移字元的含義。
\a(警報)是 ANSI C89 添加的,用於產生可聽或者可視的警報。\a 產生的效果取決於硬體。一般來說,輸出 \a 會產生鳴響。但是在某些系統,輸出 \a 不會產生任何效果,或者僅僅顯示一個特殊字元。標准明確指出,\a 不應該改變當前活躍位置(active position)。所謂活躍位置,是指顯示設備(顯示器、打字機、列印機等等)顯示下一個字元的位置。以顯示器為例,活躍位置就是指游標所處的位置,輸出 \a 不會導致游標移動位置。
\b、\f、、、\t,以及 \v 都是輸出設備控制符。退格符(\b)使當前行的活躍位置後退一個位置。換頁符(\f)使活躍位置跳到下一頁的開端。註:換頁符可用於控制列印機換頁,但不會導致 PC 機的顯示屏換頁。換行符()使活躍位置跳到下一行的開端。回車符()使活躍位置返回當前行的開端。水平製表符(\t)使活躍位置移動若干個位置(通常是8個)。垂直製表符(\v)使活躍位置換若干行。註:\v可用於控制列印機換若干行,但是不會導致PC機的顯示屏換行。
\\、\',以及 \" 使我們可以把 \,' 和 " 用作字元常量。如果要列印以下句子:
"\ is called 'backslash'."
我們需要使用如下語句:
printf("\"\\ is called \'backslash\'.\"");
\0oo 和 \xhh是ASCII碼的兩種特殊表示形式。如果想用八進制ASCII碼表示字元,可以在八進制數前面加上 \ ,然後用單引號引起來。例如:
beep = '\007'; /* \007 代表 \a */
打頭的那些0可以省略,也就是說,寫成 '\07' 或者 '\7' 都一樣。無論有沒有打頭的0 ,7 都會被當成八進制數處理。
從 C89 開始,C提供了用十六進製表示字元常量的方法:在反斜桿後面寫一個 x ,然後再寫 1 到 3 個十六進制數字。例如:
nl = '\xa'; /* \xa代表 */
注意:使用ASCII碼時,要注意區分數字4的ASCII碼是52 ,'4' 代表字元 4 ,而不是數字4。此外,盡管 ' ' 和 '\xa' ,'\a' 和 '\007' 是等價的,但是我們應該盡可能使用 ' ' 和 '\a' ,而不要用 '\xa' 和 '\007' 。這是因為前者易懂、便於記憶,而且移植性更高。而後者只對使用ASCII碼的系統有效。和數字字元。例如:字元
5. 字元輸出
printf函數使用 %c 表示輸出字元。因為字元是以 1 位元組整數的形式存取的,所以,如果使用 %d 的話,輸出的會是整數。例如:
/* 這個程序輸出字元以及字元的整數編碼 */ #include <stdio.h>
int main(void) {
charch;
printf("Please enter a character. ");
scanf("%c", &ch); /* 由用戶輸入一個字元 */ printf("The code for %c is %d. ", ch, ch); return 0; }
請各位自行編譯執行此程序,查看其執行結果。輸入字元後記得要按回車鍵。
printf函數輸出ch的值兩次,第一次以字元的形式輸出(因為格式限定符為 %c),第二次以十進制整數的形式輸出(因為格式限定符是 %d)。注意:格式限定符只是用於指定數據的輸出形式,而不是用來指定數據怎麼存儲。
6.字元類型的符號
某些編譯器中,char 默認是有符號的(signed)。對於這類型的編譯器來說,char 的表示範圍通常是 -128 到 127 。而另外一些編譯器中,char 默認是無符號的(unsigned)。對於這類型的編譯器來說,char 的表示範圍通常是 0 到 255 。一般來說,編譯器的使用說明會註明它默認把 char 當作有符號的還是無符號的。
從 C89 開始,我們可以使用關鍵字 signed 和 unsigned 來修飾 char 。這么一來,無論編譯器默認 char 是有符號的也好,無符號的也罷,我們都可以用 signed char 表示有符號 char ,也可以用 unsigned char 表示無符號 char 。
參考資料:C Primer 5th Edition C99 標准