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