在 C 語言中,指針是精華所在了,那麼我們總是覺得指針是最難理解的。它也是筆試面試中必問的知識點之一,今天我們就來看看那些複雜難懂的指針是怎麼閱讀的。
在閱讀指針相關的函數中,我們有個左右法則(這是唐長老總結的)。我們來具體看看它到底是怎樣的,a> 首先從最裏層的圓括號中未定義的標識符看起;b> 先往右看再往左看;c> 遇到圓括號或方括號時可以確定部分類型,並調轉方向;d> 重複 b 和 c 步驟,直至閱讀結束。那麼我們下來以代碼爲例進行分析
#include <stdio.h> int main() { int (*p)(int); int (*p1)(int*, int (*f)(int*)); int (*p2[5])(int*); int (*(*p3)[5])(int*); int*(*(*p4)(int*))(int*); int (*(*p5)(int*))[5]; return 0; }
那麼我們看到上面定義了好多複雜的函數,我們來一一分析
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 int(ArrayType)[5]; typedef ArrayType*(FuncType)(int*); FuncType* p5;
經過重命名之後,我們看到 p5 爲一個指針,這個指針的類型爲 ArrayType*(int*);而 ArrayType 的類型爲 int[5]。我們這樣是不是可讀性一下子就提高了呢。
那麼左右法則總結於編譯器對指針變量的解析過程,指針閱讀練習的意義在於理解指針的組合定義,我們可通過 typedef 簡化複雜指針的定義。
歡迎大家一起來學習 C 語言,可以加我QQ:243343083。