第一本C語(yǔ)言進(jìn)階學(xué)習(xí)教材
1.字符與字符串
用單引號(hào)括起來(lái)的一個(gè)字符嚴(yán)格表示一個(gè)整數(shù),而用雙引號(hào)括起來(lái)的一個(gè)字符代表一個(gè)指針埋同。
如char *slash='/'是錯(cuò)誤的有咨,因?yàn)?/'不是一個(gè)字符指針。同樣怒炸,printf('\n')可能帶來(lái)意想不到的錯(cuò)誤二打。
現(xiàn)代編譯器中拒课,'yes'這種寫(xiě)法可能不會(huì)被編譯器檢查出錯(cuò)誤烘贴,但是編譯器會(huì)理解成"一個(gè)整數(shù)值峰档,由'y','e','s'代表的整數(shù)值按特定編譯器實(shí)現(xiàn)中定義的方法組合得到败匹,與"yes"代表的含義完全不同--依次包含'y','e','s','\0'的四個(gè)連續(xù)內(nèi)存單元的首地址。
2.關(guān)于指針
例如在float *g()讥巡,g是一個(gè)指針函數(shù)掀亩,()結(jié)合優(yōu)先級(jí)高于*,這里等價(jià)于*(g())欢顷,g是一個(gè)函數(shù)槽棍,它返回值是一個(gè)指向浮點(diǎn)數(shù)的指針。在float (*h)()中抬驴,h是一個(gè)函數(shù)指針炼七,h指向的函數(shù)返回浮點(diǎn)值。
一旦知道了如何申明一個(gè)給定類(lèi)型的變量布持,那么該類(lèi)型轉(zhuǎn)換符就很容易得到:只需要把申明中的變量名和末尾的分號(hào)去掉豌拙,再把剩余的部分用一個(gè)括號(hào)整個(gè)封裝起來(lái)。
如float (*h)()>>>>(float (*)())表示一個(gè)“指向返回值為浮點(diǎn)類(lèi)型的函數(shù)的指針”的類(lèi)型轉(zhuǎn)換符题暖。
下面分析(*void(*)())0)()按傅。
首先這是一個(gè)(*)()的指針函數(shù)形式,進(jìn)行剝離后得到(void(*)())0胧卤,這是一個(gè)強(qiáng)制類(lèi)型轉(zhuǎn)換唯绍,將0轉(zhuǎn)換為“指向返回值為void的函數(shù)的指針”
3.指針與數(shù)組
- c語(yǔ)言只有一維數(shù)組,而數(shù)組的大小必須在編譯器就作為一個(gè)參數(shù)確定下來(lái)枝誊。然而數(shù)組的元素可以是任意類(lèi)型的對(duì)象况芒,所以可以利用該特性仿真一個(gè)多維數(shù)組。
- 對(duì)于一個(gè)數(shù)組叶撒,我們只能做兩件事:確定數(shù)組大小绝骚,獲得指向該數(shù)組下標(biāo)為0的元素的指針。其他的操作即使看起來(lái)是以數(shù)組下標(biāo)進(jìn)行操作痊乾,實(shí)際上都是通過(guò)指針進(jìn)行的操作皮壁。
例如若我們定義int a[3]。該語(yǔ)句申明了a是一個(gè)擁有3個(gè)整型元素的數(shù)組哪审。再定義int *p蛾魄,若希望p指向該數(shù)組,p=&a是不正確的湿滓,因?yàn)?amp;a是一個(gè)指向數(shù)組的指針而p是指向整數(shù)的指針滴须。應(yīng)寫(xiě)做p=a,即把a(bǔ)總下標(biāo)為0的元素的地址賦給p叽奥。