前言
在 C 語言中,指針是精華所在了,那麼我們總是覺得指針是最難理解的。它也是筆試面試中必問的知識點之一,今天我們就來看看那些複雜難懂的指針是怎麼閱讀的。
左右法則
在閱讀指針相關的函數中,我們來具體看看它到底是怎樣的,
- 首先從最裡層的圓括號中未定義的標識符看起;
- 先往右看再往左看;
- 遇到圓括號或方括號時可以確定部分類型,並調轉方向;
- 重複 2和 3 步驟,直至閱讀結束。那麼我們下來以代碼為例進行分析.
案例閱讀
定義如下指針,一次帶著大家做一下分析。
案例分析
- int (*p)(int);==> p;為指針,指向函數,指向的函數有個int型參數,返回值為int型
- int (*p1)(int*, int (*f)(int*));==> p1 為函數指針,指向的函數有int*,f 為第二個參數,它是函數指針,指向的函數參數為int*,返回值為int;;; 返回值類型為int
- int (*p2[5])(int*);==> p2 為數組,有5個元素,每個元素是指針,指向函數,類型為int(int*)
- int (*(*p3)[5])(int*);==> p3 為指針,數組指針,指向的數組有5個元素,這5個元素為指針,是函數指針,指向的函數類型為int(int*)
- int*(*(*p4)(int*))(int*);==> p4; 為指針,函數指針,參數為int*,返回值為指針,是函數指針,指向的函數類型為int*(int*)
- int (*(*p5)(int*))[5];==> p5 為指針,函數指針,參數為int*,返回值為指針,指向數組,指向的數組類型為int[5]
利用typedef
我們看到其實經過分析之後,函數也不難,但是這樣它的可讀性很差。我們可以將上面最後一個改用 typedef 進行重命名,如下:
經過重命名之後,我們看到 p5 為一個指針,這個指針的類型為 ArrayType*(int*);而 ArrayType 的類型為 int[5]。我們這樣是不是可讀性一下子就提高了呢。那麼左右法則總結於編譯器對指針變量的解析過程,指針閱讀練習的意義在於理解指針的組合定義,我們可通過 typedef 簡化複雜指針的定義。
更多精彩
閱讀更多 C語言基礎 的文章