C語言裡面的嵌套聲明的讀法

來源:互聯網
上載者:User

轉自:http://blog.csdn.net/hikaliv/archive/2009/06/09/4255124.aspx


int (*base[2])[2];

base是一個數組,這個數組有2個元素,每個元素都是一個指標,這些指標所指向的對象是具有兩個int元素的數組 

C語言所有複雜的指標聲明,都是由各種聲明嵌套構成的。如何解讀複雜指標聲明呢?右左法則是一個既著名又常用的方法。不過,右左法則其實並不是C標
准裡面的內容,它是從C標準的聲明規定中歸納出來的方法。C標準的聲明規則,是用來解決如何建立聲明的,而右左法則是用來解決如何辯識一個聲明的,兩者可
以說是相反的。右左法則的英文原文是這樣說的:

The right-left rule: Start reading the
declaration from the innermost parentheses, go right, and then go left.
When you encounter parentheses, the direction should be reversed. Once
everything in the parentheses has been parsed, jump out of it. Continue
till the whole declaration has been parsed.

這段英文的翻譯如下:
右左法則:首先從最裡面的圓括弧看起,然後往右看,再往左看。每當遇到圓括弧時,就應該掉轉閱讀方向。一旦解析完圓括弧裡面所有的東西,就跳出圓括弧。重複這個過程直到整個聲明解析完畢。

對這個法則進行一個小小的修正,應該是從未定義的標識符開始閱讀,而不是從括弧讀起,之所以是未定義的標識符,是因為一個聲明裡面可能有多個標識符,但未定義的標識符只會有一個。

現在通過一些例子來討論右左法則的應用,先從最簡單的開始,逐步加深:

int (*func)(int *p);
首先
找到那個未定義的標識符,就是func,它的外面有一對圓括弧,而且左邊是一個*號,這說明func是一個指標,然後跳出這個圓括弧,先看右邊,也是一個
圓括弧,這說明(*func)是一個函數,而func是一個指向這類函數的指標,就是一個函數指標,這類函數具有int*類型的形參,傳回值類型是
int。

int (*func)(int *p, int (*f)(int*));
func被一對括弧包含,且左邊有一
個*號,說明func是一個指標,跳出括弧,右邊也有個括弧,那麼func是一個指向函數的指標,這類函數具有int *和int
(*)(int*)這樣的形參,傳回值為int類型。再來看一看func的形參int
(*f)(int*),類似前面的解釋,f也是一個函數指標,指向的函數具有int*類型的形參,傳回值為int。

int (*func[5])(int *p);
func
右邊是一個[]運算子,說明func是一個具有5個元素的數組,func的左邊有一個*,說明func的元素是指標,要注意這裡的*不是修飾func的,
而是修飾func[5]的,原因是[]運算子優先順序比*高,func先跟[]結合,因此*修飾的是func[5]。跳出這個括弧,看右邊,也是一對圓括
號,說明func數組的元素是函數類型的指標,它所指向的函數具有int*類型的形參,傳回值類型為int。

int (*(*func)[5])(int *p);
func
被一個圓括弧包含,左邊又有一個*,那麼func是一個指標,跳出括弧,右邊是一個[]運算子號,說明func是一個指向數組的指標,現在往左看,左邊有
一個*號,說明這個數組的元素是指標,再跳出括弧,右邊又有一個括弧,說明這個數組的元素是指向函數的指標。總結一下,就是:func是一個指向數組的指
針,這個數組的元素是函數指標,這些指標指向具有int*形參,傳回值為int類型的函數。

int (*(*func)(int *p))[5];
func是一個函數指標,這類函數具有int*類型的形參,傳回值是指向數組的指標,所指向的數組的元素是具有5個int元素的數組。

實際當中,需要聲明一個複雜指標時,如果把整個聲明寫成上面所示的形式,對程式可讀性是一大損害。應該用typedef來對聲明逐層分解,增強可讀性,例如對於聲明:
int (*(*func)(int *p))[5];

可以這樣分解:
typedef  int (*PARA)[5];
typedef PARA (*func)(int *);
這樣就容易看得多了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.