使用“洋蔥法”求解複雜指針

       看到《The C Programming Language》Page112頁,講到複雜指針,由於本人對此處一直比較敬畏,雖然在大二的時候讀過一遍《C 與指針》,但由於久疏運用,忘得也差不多了。今天準備好好研究一下。

       文章參考的supermegaboy的文章複雜指針解析,並沒有抄襲的意思,只是想自己留作參考查看之用,如不小心觀測此文,不妨去原文瞻仰一番大牛之作。

       首先是一個面試題目“int (*a[10](int))是什麼含義?”

       如果對指針的理解不到位的話,我相信對這個題目還是一籌莫展,根據supermegaboy文章中的方法解析即爲:

a的右側有[10]說明a是一個數組,再看左側有個*,說明數組的元素是指針,在看括號右邊是(int),說明指針的類型是個函數指針,此指針指向的函數具有int類型的形參,最左邊的int說明函數的返回值爲int.因此本題目的答案即爲:a數組的元素是函數類型的指針,它所指向的函數具有int類型的形參,返回值類型爲int。
先把我覺得有點意思的地方寫清楚,免得遺忘:標號前面的*的位置很重要,結合的順序不同意思也不同。

*意味着是指針,具體指針是指向的啥還要前後左右的分析

例如 int a[10]意思爲:a是一個數組,數組元素爲整形

        int (*a)[10]意思爲:a是一個指向數組的指針,數組的元素爲整形

        int *a[10]意思爲:a是一個數組,數組的元素爲整形指針。

貌似上面的意思就是大家所說的指針數組與數組指針,具體哪個我也記不清了。這地方查閱石虎的C後添加。

 int *a()意思爲: 函數a的返回值爲int*類型

 int (*a)()意思爲:a是以個函數指針,它所指向的函數具有空參,返回值爲int


這類題目可以理解爲三段式:【(數組類型)(標識)(數組)】組合於【(函數返回值)(標識)(函數)】組合於【(指針)(標識)(空)】具體屬於哪一種要根據第三段的類型區分([]意味着數組,第一段就爲數組類型;與之相對,()意味着函數,第一段就爲函數返回值)

洋蔥法解析:

洋蔥法就像楊宗緯剝洋蔥,不過是由內而外:每層的判斷順序爲(2-3-1),首先定位到第二段標識,然後根據第三段剝洋蔥判斷是數組還是函數,接着由第一段得到數組元素類型或者函數返回值類型。逐層去掉每個括號就像剝掉每層洋蔥,直到得到求解完畢。

備註:這類題目的特徵是第一段的類型總是個指針,因爲只有這樣才能跟下一層洋蔥聯繫起來。

具體實例:

int (*func[5])(int *p);

func右邊是一個[]運算符,說明func是一個具有5個元素的數組,func的左邊有一個*,說明func的元素是指針,要注意這裏的*不是修飾func的,而是修飾func[5]的,原因是[]運算符優先級比*高,func先跟[]結合,因此*修飾的是func[5]。跳出這個括號,看右邊,也是一對圓括號,說明func數組的元素是函數類型的指針,它所指向的函數具有int*類型的形參,返回值類型爲int。

(洋蔥法:func是一個數組,數組的元素是指針,指針指向啥?剝掉一層,指針指向一個函數,函數的形參爲int*p,函數的返回值爲int。func數組的元素是函數類型的指針,它所指向的函數具有int*類型的形參,返回值類型爲int)

 

int (*(*func)[5])(int *p);

func被一個圓括號包含,左邊又有一個*,那麼func是一個指針,跳出括號,右邊是一個[]運算符號,說明func是一個指向數組的指針,現在往左看,左邊有一個*號,說明這個數組的元素是指針,再跳出括號,右邊又有一個括號,說明這個數組的元素是指向函數的指針。總結一下,就是:func是一個指向數組的指針,這個數組的元素是函數指針,這些指針指向具有int*形參,返回值爲int類型的函數。

(洋蔥法:func是一個指針,指針指向啥?剝掉一層,指針指向一個數組,數組的元素是指針,指向啥?再剝掉一層,指向一個函數,函數的形參爲int*p,函數的返回值爲int。func是一個指向數組的指針,這個數組的元素是函數指針,這些指針指向具有int*形參,返回值爲int類型的函數。)

根據三段原理此處*必須添加,意味着標誌,數組元素爲指針,否則int ((*func)[5])(int *p);數組元素的類型就是未知了


int (*(*func)(int *p))[5];

func是一個函數指針,這類函數具有int*類型的形參,返回值是指向數組的指針,所指向的數組的元素是具有5個int元素的數組。

(洋蔥法:func是一個指針,指針指向啥?剝掉一層,指針指向一個函數,函數的形參爲int*,返回值爲指針,指針指向啥?在剝掉一層,指針指向一個數組,數組的長度爲5,數組每個原色的類型爲int,func是一個函數指針,這類函數具有int*類型的形參,返回值是指向數組的指針,所指向的數組的元素是具有5個int元素的數組。


char (*(*x())[])()
   x是一個沒有參數的函數, 它的返回值是指向一個數組的指針, 而這個數組的元    素是函數指針, 指向的函數沒有參數, 且返回char.

(洋蔥法:x是一個函數,函數無形參,返回值是一個指針,這個指針指向啥?剝掉一層,指針指向一個數組,數組的元素爲指針,這個指針指向啥?在剝掉一層,指針指向一個無形參返回值爲char的函數。即無參函數x返回一個數組指針,它所指向的數組是一個指針數組,數組的每個指針元素指向的參數沒有形參,返回值爲char)


char (*(*x[3])())[5]
   x是一個函數指針數組,函數沒有參數,返回char (*)[5]的數組指針

(洋蔥法:x是一個數組,數組的元素是指針,指針指向啥?剝掉一層,指針指向一個函數,這個函數函數沒有形參返回值仍然是指針,函數返回的指針指向啥?再剝掉一層,指針指向一個長度爲5的數組,數組的元素爲char類型。即x數組的元素是函數類型的指針,它所指向的函數沒有參數,返回值爲char (*)[5]的數組指針。)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章