進一步探討指向指針的指針
指針的指針使用過多會使程序變得龐大,變得難以維護。但指針的指針在如鏈表的插入操作中,又是必須的;
綜上所述在不需要使用指針的指針的地方就盡量不要使用。
高級聲明
int f; ? ? ? ? ? int ?*f; ? ? ? int *f,g;
int f(); ? ? ? ? int *f();/*()的優先級大于* ,所以這里指函數f的返回值為int * ?*/ ? ? ? ? ?int (*f)(); /*f是一個函數指針,其返回值為int */
int ?f[]; ? int *f[] ?/*下標的優先級更高,所以f是一個數組,數組元素為int ?* */
int (*f[])();f首先是一個數組,數組元素是一個指針,這個指針是函數指針類型
函數指針
回調函數
最常用的應用場景,當你需要在一個鏈表里查找某個值時,如果是數字字符是否相等用==就好了,如果是字符串的話就需要使用另外的比較方式。所以為了完成查找這個值得在函數中考慮不同的值類型。一種較好的方法是,我們在鏈表中查找某個值的函數定義的參數中聲明一個函數指針(不同的值就傳不同的比較函數)。然后值的參數類型用void *,因為值有很多中,這樣不同的值類型都可以用這同一個鏈表差值的函數,只是給它傳遞不同比較函數即可。
轉移表
類似這樣的場景可以用轉移表。當考慮多種情況,分情況選擇不同的處理。最常采用的方法是使用switch結構,但如果情況多了的話,switch會顯得異常臃腫。我們可以采用轉移表的方法來解決這個問題,不同的處理我們用不同的函數,然后聲明一個函數指針,不同的情況對應不同的下標,然后分別調用相應的處理函數即可。
命令行參數
字符串常量
下面兩個小例子用到了這個知識