C 語言複雜宣告的理解

2021-06-23 03:38:15 字數 1672 閱讀 9979

c語言常常因為宣告的語法問題而受到人們的批評,特別是涉及到函式指標的語法。c語言的語法力圖使宣告和使用相一致。對於簡單的情況,c語言的做法是很有效的,但是,如果情況比較複雜,則容易讓人混淆,原因在於,c語言的宣告不能從左至右閱讀,而且使用了太多的圓括號.

但是找到正確的規則去理解, 無論多複雜都可以搞清楚.原則如下:

1. 從裡到外

2.按照優先順序順序,優先順序順序相同時候,從右邊到左邊

看幾個例子,來自c語言爸爸的書.

int *f(); /* f: function returning pointer to int */

這個很簡單, 從f開始, f是定義的變數, ()優先順序高, 於是看f(), f是乙個函式定義. 以後看到* 與int結合, int* 返回值. 所以, 這是乙個返回值為int指標的函式.

int (*pf)(); /* pf: pointer to function returning int */

pf是乙個變數,  與*結合, *pf是乙個指標, 在於()結合, pf是乙個函式指標, 再看int為返回值.那麼, 這就是乙個返回值為int的無引數, 函式指標.

int (*daytab)[13]

daytab: pointer to array[13] of int

daytab 是乙個變數,  * daytab是乙個指標, (*daytab)[13] 是乙個指向陣列的指標, int (*daytab)[13] 是乙個指向int型的陣列指標.

下面2個異常的複雜, 記住上面的規則, 照樣解析明白:

char (*(*x()))()

x: function returning pointer to array of

pointer to function returning char

x 是乙個變數

x() 是乙個函式

*x() 是乙個返回指標

(*x()) 根據結合律, 返回的指標指向陣列

*(*x()) 陣列裡面放的都是指標

(*(*x()))() 陣列裡面的指標指向函式

char (*(*x()))() 指向的函式返回值為char

所以, x是乙個函式, 返回值為乙個指標,指向乙個陣列,陣列裡面都是指向函式的指標,指向的函式返回值為char  , 無引數

在來看最後乙個, 都是c爸爸書上給的例子, 其實有了規則也不複雜,編譯器都能解析.

char (*(*x[3])())[5]

x: array[3] of pointer to function returning

pointer to array[5] of char

x 是乙個變數

x[3] 是乙個陣列, 再次強調結合律

*x[3] 陣列裡面都是指標

(*x[3])() 陣列裡面指標指向函式, 還是強調結合律

*(*x[3])() 函式的返回值是指標

*(*x[3])()[5] 返回值指標,指向的是乙個陣列

char *(*x[3])()[5] 這個陣列是char型別的

所以, x是乙個陣列, 陣列裡面是指向函式的指標, 指向的函式返回值是乙個指標,指向char型別的陣列.

C語言複雜宣告

專家程式設計 第三章介紹了如何分析複雜的宣告,講的非常不錯。對於作者介紹的分析複雜宣告的方法,我沒有完全掌握,不過,我有我自己的一套方法來解析複雜的宣告,正所謂條條大道通羅馬,只要結果一樣,必須在乎過程呢。今天在網上找了幾個複雜的宣告,練練手 宣告的例子全部來自網路,原諒出處未詳 記下此文,作個標記...

C語言複雜宣告

問題1 宣告與函式 void 0 讓我們從兩個不同的途徑來詳細分析這個問題。分析 首先,最基本的函式宣告 void function paramlist 最基本的函式呼叫 function paramlist 鑑於問題中的函式沒有引數,函式呼叫可簡化為 function 其次,根據問題描述,可以知道...

複雜宣告 C語言

今天看了 c專家程式設計 裡的 分析c語言的宣告 一章,終於懂了c語言的複雜宣告是怎麼解析的。雖然在平時寫 的時候用到複雜宣告的情況幾乎沒有,這裡還是做乙個記錄,也是加深對c語言宣告的理解。以下規則來自 c專家程式設計 c語言宣告的優先順序規則 c.如果const或volatile 關鍵字的後面緊跟...