當前位置:才華齋>計算機>C語言>

C語言之複雜指標詳解

C語言 閱讀(2.52W)

因為C語言所有複雜的指標宣告,都是由各種宣告巢狀構成的。如何解讀複雜指標宣告呢?右左法則是一個既著名又常用的方法。不過,右左法則其實並不是C標準裡面的內容,它是從C標準的宣告規定中歸納出來的方法。下面是小編為大家整理的C語言之複雜指標詳解,歡迎參考~

C語言之複雜指標詳解

在《C陷阱與缺陷》第二章第一節中有這樣一個宣告:

   (*(void(*)())0)();

看到這樣的表示式估計讓不少人都“不寒而慄”了吧,其實雖然看起來複雜,但是構造這類表示式其實只有一條簡單的規則:按照使用的方式來宣告。

首先先介紹一個著名的解析法則:右左法則:首先從圓括號起,然後向右看,然後向左看,每當遇到圓括號時,就調轉閱讀方向,當括號內的內容解析完畢,就跳出這個括號,重複這個過程直到表示式解析完畢。

其實我們發現,所謂複雜指標離不開指標函式,函式指標,指標陣列,函式指標這四個概念並且括號,*比較多,其實只要我們仔細分析這些看起來複雜的表示式,其實他的邏輯也是很清晰的。

  舉個例子,使用右左法則解析複雜的表示式:

Int *(*(*pfun)(int *))[10];

用右左法則解析這個表示式,首先要找到未定義的識別符號pfun,當往右看的時候遇到括號,於是調轉方向,再朝相反的'方向看,pfun遇到了*,說明pfun是一個指標,再往左看又遇到了括號,因此又要調轉方向,遇到的是另外一個括號,因此說明指標所指向的是一個函式,函式的引數是一個整型指標。然後又向相反的方向看,又遇到了一個*,說明該函式的返回值又是一個指標,在往左看又遇到括號,所以再次調轉方向,把內側的括號裡的內容看完,出了括號遇到的是陣列,說明指標所指向的函式的返回值型別的指標指向的是陣列,這有點向繞口令,但是還是有邏輯可循的。

但是右左法則確實有點麻煩,我們這樣看上面這個表示式:首先fpun是一個指向函式的函式指標,該函式有一個整型指標型別的引數並且返回值也是一個指標,所返回的型別指向的是一個數組,並且這個陣列有10個元素,每個元素是整型指標型別。

接下來我們在回過頭來看文章最開始的那個表示式:

(*(void(*)())0)();

我們先看括號裡面的內容,首先0被強制轉換為一個返回值為void型別,沒有引數的函式的函式指標,指標(void)(*)()0)指向了一個函式。

要想很好的解決這個問題,選擇使用typedef是一個很好的方式。