指針是C和C++中編程最復雜也是最有技巧的部分,但對於新手來說,指針無疑是最致命的,讓很多人望而退步。不過很多事情都是從陌生開始,然后漸漸熟悉起來的,就像交朋友一樣,得花點時間去培養感情才行。不過指針這位朋友可比較高冷,只花一點點時間恐怕不夠,得多學多練多接觸,它才會給你展示它熱情的一面。
好了,廢話不多說,相信很多人在識別指針類型的時候,經常會出錯,像void * p;這樣的指針自然好認,但是像int (*fp[])(int*);或者float (*(*fp2)(int,int,float))(int);這樣的指針可能就沒那么好認了。其實不用怕,都是有規(套)則(路)的。
一般的解決辦法是從中間開始向外擴展,從中間開始即從變量名開始,拿float (*(*fp2)(int,int,float))(int);舉例子,就是從fp2開始,向外擴展的意思是先看右邊最近項,fp2的右邊是右括號,沒有意義,然后注意左邊,星號表示fp2是一個指針,再看右邊,是一個參數表,說明fp是一個指向函數的指針,且這個函數有三個參數,分別是int、int、float類型,再看左邊,星號表示該函數返回值為指針,再看右邊,右括號,沒有意義,看左邊,左括號,無意義,看右邊,參數列表,表明返回的指針是指向函數的指針,且函數有一個int型參數,最后float表示函數返回值為float*型,所以總結一下便是,fp2是一個指向函數的指針,該函數接受三個參數(int,int,float),並且返回一個指向函數的指針,該函數接受一個整形參數並返回一個float*值。
看起來很復雜,解讀起來也很麻煩,看到以后想打作者的心都有了,但沒辦法,當需要用到的時候還是得硬着頭皮上。
最后做兩個小練習:
void * (*(*fp1)(int))[10];
double (*(*(*fp2)())[10])();
解答:
fp1是一個指向函數的指針,該函數接受一個整形參數並且返回一個指向10個void指針數組的指針
fp2是一個指向函數的指針,該函數無參數,且返回一個指向含有10個指向函數指針數組的指針,這些函數不接受參數且返回double值。