C語(yǔ)言字符數(shù)組和字符指針
常量和符號(hào)常量
在程序運(yùn)行過(guò)程中,其值不能被改變的量稱之為常量。常量分為不同的類型,有整型常量如 1、2、3、100;浮點(diǎn)型常量 3.14、0.56、-4.8;字符型常量?a?、?b?、?0?;字符串常量“a”、“abc”、“1234”、“1234abcd”等。
細(xì)心的同學(xué)會(huì)發(fā)現(xiàn),整型和浮點(diǎn)型常量我們直接寫(xiě)的數(shù)字,而字符型常量用單引號(hào)來(lái)表示一個(gè)字符,用雙引號(hào)來(lái)表示一個(gè)字符串,尤其大家要注意?a?和“a”是不一樣的,這個(gè)等會(huì)我們要詳細(xì)介紹。
常量一般有兩種表現(xiàn)形式:
直接常量:直接以值的形式表示的常量稱之為直接常量。上述舉例這些都是直接常量,直接寫(xiě)出來(lái)了。
符號(hào)常量:用標(biāo)識(shí)符命名的常量稱之為符號(hào)常量,就是為上面的直接常量再取一個(gè)名字。使用符號(hào)常量一是方便理解,提高程序可讀性,更重要的是方便程序的后續(xù)維護(hù),習(xí)慣上符號(hào)常量我們都用大寫(xiě)字母和下劃線來(lái)命名。
比如,我們可以把 3.14 取名為 PI(即π)。再比如,我們上節(jié)課的串口程序,我們用的波特率是 9600,如果用符號(hào)常量來(lái)進(jìn)行提前聲明的話,那我們要修改成其它速率的話,就不用在程序中找 9600 修改了,直接修改聲明處就可以了,兩種方法舉例說(shuō)明。用 const 聲明。比如我們?cè)诔绦蜷_(kāi)始位置定義一個(gè)符號(hào)常量 BAUD。
定義形式是:
const 類型 符號(hào)常量名字=常量值;
如
const unsigned int BAUD = 9600; /*注意結(jié)尾有個(gè)分號(hào)*/
我們就可以在程序中直接把 9600 改成 BAUD,這樣我們?nèi)绻牟ㄌ芈实脑?,直接在程序開(kāi)頭位置改一下這個(gè)值就可以了。用預(yù)處理命令#define 來(lái)完成,預(yù)處理命令我們先來(lái)認(rèn)識(shí)#define。
定義形式是:
#define 符號(hào)常量名 常量值
如
#define BAUD 9600 /*注意結(jié)尾沒(méi)有分號(hào)*/
這樣定義以后,只要在程序中出現(xiàn) BAUD 的話,意思就是完全替代了后邊的 9600 這個(gè)數(shù)字。
不知大家是否記得,我們之前定義數(shù)碼管真值表的時(shí)候,用了一個(gè) code 關(guān)鍵字。
unsigned char code LedChar[] = { //數(shù)碼管顯示字符轉(zhuǎn)換表
0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};
我們當(dāng)時(shí)說(shuō)加了 code 之后,這個(gè)真值表的數(shù)據(jù)只能被使用,不能被改變,如果我們直接寫(xiě) LedChar[0] = 1;這樣就錯(cuò)了。實(shí)際上 code 這個(gè)關(guān)鍵字是 51 單片機(jī)特有的,如果是其它類型的單片機(jī)我們只需要寫(xiě)成 const unsigned char LedChar[]={}就可以了,自動(dòng)保存到 FLASH里,而 51 單片機(jī)只用 const 而不加 code 的話,這個(gè)數(shù)組會(huì)保存到 RAM 中,而不會(huì)保存到FLAHS 中,鑒于此,在 51 這個(gè)體系下,const 反倒變得不那么重要了,它的作用被 code 取代了,這里大家知道這么回事即可。
我們來(lái)對(duì)各種類型的常量做進(jìn)一步說(shuō)明。
整型常量和浮點(diǎn)型常量就沒(méi)多少可說(shuō)的了,之前我們應(yīng)用的都很熟練了,整型直接寫(xiě)數(shù)字就是十進(jìn)制如 128,前邊 0x 開(kāi)頭的表示是十六進(jìn)制 0x80,浮點(diǎn)型直接寫(xiě)帶小數(shù)點(diǎn)的數(shù)據(jù)就可以了。
字符型常量是由一對(duì)單引號(hào)括起來(lái)的單個(gè)字符。它分為兩種形式,一種是普通字符,一種是轉(zhuǎn)義字符。
普通字符就是那些我們可以直接書(shū)寫(xiě)直接看到的有形的字符,比如阿拉伯?dāng)?shù)字 0~9,英文字符 A~z,以及標(biāo)點(diǎn)符號(hào)等。它們都是 ASCII 碼表中的字符,而它們?cè)趩纹瑱C(jī)中都占用一個(gè)字節(jié)的空間,其值就是對(duì)應(yīng)的 ASCII 碼值。比如?a?的值是 97,?A?的值是 65,?0?的值是48,如果定義一個(gè)變量 unsigned char a = ?a?,那么變量 a 的值就是 97。
除了上述這些字符之外,還有一些特殊字符,它們一些是無(wú)形的,像回車符、換行符這些都是看不到的,還有一些像?”這類字符它們已經(jīng)有特殊用途了,想象一下如果寫(xiě) '''覺(jué)得編譯器會(huì)怎么去解釋呢。針對(duì)這些特殊符號(hào),為了可以讓它們正常進(jìn)入到我們的程序代碼中,C 語(yǔ)言就規(guī)定了轉(zhuǎn)義字符,它是以反斜杠()開(kāi)頭的特定字符序列,讓它們來(lái)表示這些特殊字符,比如我們用n 來(lái)代表?yè)Q行。我們用一個(gè)簡(jiǎn)單表格來(lái)說(shuō)明一下常用的轉(zhuǎn)義字符的意思,如表 12-2 所示。
表 12-2 常用轉(zhuǎn)義字符及含義
字符形式含義
n換行
t橫向跳格(相當(dāng)于 Tab)
v豎向跳格
b退格
r光標(biāo)移到行首
\反斜杠字符??
?單引號(hào)字符
”雙引號(hào)字符
f走紙換頁(yè)
