在 C 語言中,指針是精華所在了,那么我們總是覺得指針是最難理解的。它也是筆試面試中必問的知識點(diǎn)之一,今天我們就來看看那些復(fù)雜難懂的指針是怎么閱讀的。
網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、重慶小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了隆林免費(fèi)建站歡迎大家使用!
在閱讀指針相關(guān)的函數(shù)中,我們有個左右法則(這是唐長老總結(jié)的)。我們來具體看看它到底是怎樣的,a> 首先從最里層的圓括號中未定義的標(biāo)識符看起;b> 先往右看再往左看;c> 遇到圓括號或方括號時可以確定部分類型,并調(diào)轉(zhuǎn)方向;d> 重復(fù) b 和 c 步驟,直至閱讀結(jié)束。那么我們下來以代碼為例進(jìn)行分析
#includeint 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; }
那么我們看到上面定義了好多復(fù)雜的函數(shù),我們來一一分析
int (*p)(int); ==> p 為指針,指向函數(shù),指向的函數(shù)有個int型參數(shù),返回值為int型 int (*p1)(int*, int (*f)(int*)); ==> p1 為函數(shù)指針,指向的函數(shù)有int*,f 為第二個參數(shù),它是函數(shù)指針,指向的函數(shù)參數(shù)為int*,返回值為int;;; 返回值類型為int int (*p2[5])(int*); ==> p2 為數(shù)組,有5個元素,每個元素是指針,指向函數(shù),類型為int(int*) int (*(*p3)[5])(int*); ==> p3 為指針,數(shù)組指針,指向的數(shù)組有5個元素,這5個元素為指針,是函數(shù)指針,指向的函數(shù)類型為int(int*) int*(*(*p4)(int*))(int*); ==> p4 為指針,函數(shù)指針,參數(shù)為int*,返回值為指針,是函數(shù)指針,指向的函數(shù)類型為int*(int*) int (*(*p5)(int*))[5]; ==> p5 為指針,函數(shù)指針,參數(shù)為int*,返回值為指針,指向數(shù)組,指向的數(shù)組類型為int[5]
我們看到其實(shí)經(jīng)過分析之后,函數(shù)也不難,但是這樣它的可讀性很差。我們可以將上面最后一個改用 typedef 進(jìn)行重命名,如下
typedef int(ArrayType)[5]; typedef ArrayType*(FuncType)(int*); FuncType* p5;
經(jīng)過重命名之后,我們看到 p5 為一個指針,這個指針的類型為 ArrayType*(int*);而 ArrayType的類型為 int[5]。我們這樣是不是可讀性一下子就提高了呢。
那么左右法則總結(jié)于編譯器對指針變量的解析過程,指針閱讀練習(xí)的意義在于理解指針的組合定義,我們可通過 typedef 簡化復(fù)雜指針的定義。
歡迎大家一起來學(xué)習(xí) C 語言,可以加我QQ:243343083。