- 相關(guān)推薦
C語(yǔ)言之復(fù)雜指針詳解
因?yàn)镃語(yǔ)言所有復(fù)雜的指針聲明,都是由各種聲明嵌套構(gòu)成的。如何解讀復(fù)雜指針聲明呢?右左法則是一個(gè)既著名又常用的方法。不過,右左法則其實(shí)并不是C標(biāo)準(zhǔn)里面的內(nèi)容,它是從C標(biāo)準(zhǔn)的聲明規(guī)定中歸納出來的方法。下面是小編為大家整理的C語(yǔ)言之復(fù)雜指針詳解,歡迎參考~
在《C陷阱與缺陷》第二章第一節(jié)中有這樣一個(gè)聲明:
(*(void(*)())0)();
看到這樣的表達(dá)式估計(jì)讓不少人都“不寒而栗”了吧,其實(shí)雖然看起來復(fù)雜,但是構(gòu)造這類表達(dá)式其實(shí)只有一條簡(jiǎn)單的規(guī)則:按照使用的方式來聲明。
首先先介紹一個(gè)著名的解析法則:右左法則:首先從圓括號(hào)起,然后向右看,然后向左看,每當(dāng)遇到圓括號(hào)時(shí),就調(diào)轉(zhuǎn)閱讀方向,當(dāng)括號(hào)內(nèi)的內(nèi)容解析完畢,就跳出這個(gè)括號(hào),重復(fù)這個(gè)過程直到表達(dá)式解析完畢。
其實(shí)我們發(fā)現(xiàn),所謂復(fù)雜指針離不開指針函數(shù),函數(shù)指針,指針數(shù)組,函數(shù)指針這四個(gè)概念并且括號(hào),*比較多,其實(shí)只要我們仔細(xì)分析這些看起來復(fù)雜的表達(dá)式,其實(shí)他的邏輯也是很清晰的。
舉個(gè)例子,使用右左法則解析復(fù)雜的表達(dá)式:
Int *(*(*pfun)(int *))[10];
用右左法則解析這個(gè)表達(dá)式,首先要找到未定義的標(biāo)識(shí)符pfun,當(dāng)往右看的時(shí)候遇到括號(hào),于是調(diào)轉(zhuǎn)方向,再朝相反的方向看,pfun遇到了*,說明pfun是一個(gè)指針,再往左看又遇到了括號(hào),因此又要調(diào)轉(zhuǎn)方向,遇到的是另外一個(gè)括號(hào),因此說明指針?biāo)赶虻氖且粋(gè)函數(shù),函數(shù)的參數(shù)是一個(gè)整型指針。然后又向相反的方向看,又遇到了一個(gè)*,說明該函數(shù)的返回值又是一個(gè)指針,在往左看又遇到括號(hào),所以再次調(diào)轉(zhuǎn)方向,把內(nèi)側(cè)的括號(hào)里的內(nèi)容看完,出了括號(hào)遇到的是數(shù)組,說明指針?biāo)赶虻暮瘮?shù)的返回值類型的指針指向的是數(shù)組,這有點(diǎn)向繞口令,但是還是有邏輯可循的。
但是右左法則確實(shí)有點(diǎn)麻煩,我們這樣看上面這個(gè)表達(dá)式:首先fpun是一個(gè)指向函數(shù)的函數(shù)指針,該函數(shù)有一個(gè)整型指針類型的參數(shù)并且返回值也是一個(gè)指針,所返回的類型指向的是一個(gè)數(shù)組,并且這個(gè)數(shù)組有10個(gè)元素,每個(gè)元素是整型指針類型。
接下來我們?cè)诨剡^頭來看文章最開始的那個(gè)表達(dá)式:
(*(void(*)())0)();
我們先看括號(hào)里面的內(nèi)容,首先0被強(qiáng)制轉(zhuǎn)換為一個(gè)返回值為void類型,沒有參數(shù)的函數(shù)的函數(shù)指針,指針(void)(*)()0)指向了一個(gè)函數(shù)。
要想很好的解決這個(gè)問題,選擇使用typedef是一個(gè)很好的方式。
【C語(yǔ)言之復(fù)雜指針詳解】相關(guān)文章:
C語(yǔ)言指針用法詳解08-21
C語(yǔ)言數(shù)組與指針詳解08-15
C語(yǔ)言的指針類型詳解05-21
C語(yǔ)言復(fù)雜指針是什么08-15
C語(yǔ)言指針函數(shù)和函數(shù)指針詳解09-29
C++ this指針詳解07-04
C語(yǔ)言入門之指針用法06-24