第一本C語言進階學習教材
1.字符與字符串
用單引號括起來的一個字符嚴格表示一個整數,而用雙引號括起來的一個字符代表一個指針。
如char *slash='/'是錯誤的,因為'/'不是一個字符指針。同樣,printf('\n')可能帶來意想不到的錯誤。
現代編譯器中,'yes'這種寫法可能不會被編譯器檢查出錯誤,但是編譯器會理解成"一個整數值,由'y','e','s'代表的整數值按特定編譯器實現中定義的方法組合得到,與"yes"代表的含義完全不同--依次包含'y','e','s','\0'的四個連續內存單元的首地址。
2.關于指針
例如在float *g(),g是一個指針函數,()結合優先級高于*,這里等價于*(g()),g是一個函數,它返回值是一個指向浮點數的指針。在float (*h)()中,h是一個函數指針,h指向的函數返回浮點值。
一旦知道了如何申明一個給定類型的變量,那么該類型轉換符就很容易得到:只需要把申明中的變量名和末尾的分號去掉,再把剩余的部分用一個括號整個封裝起來。
如float (*h)()>>>>(float (*)())表示一個“指向返回值為浮點類型的函數的指針”的類型轉換符。
下面分析(*void(*)())0)()。
首先這是一個(*)()的指針函數形式,進行剝離后得到(void(*)())0,這是一個強制類型轉換,將0轉換為“指向返回值為void的函數的指針”
3.指針與數組
- c語言只有一維數組,而數組的大小必須在編譯器就作為一個參數確定下來。然而數組的元素可以是任意類型的對象,所以可以利用該特性仿真一個多維數組。
- 對于一個數組,我們只能做兩件事:確定數組大小,獲得指向該數組下標為0的元素的指針。其他的操作即使看起來是以數組下標進行操作,實際上都是通過指針進行的操作。
例如若我們定義int a[3]。該語句申明了a是一個擁有3個整型元素的數組。再定義int *p,若希望p指向該數組,p=&a是不正確的,因為&a是一個指向數組的指針而p是指向整數的指針。應寫做p=a,即把a總下標為0的元素的地址賦給p。