糯米文學吧

位置:首頁 > 計算機 > C語言

C語言之複雜指針詳解

C語言2.48W

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

C語言之複雜指針詳解

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

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

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

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

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

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

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

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

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

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

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

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

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

標籤:指針 語言