分析C語言宣告的通用方法(經典 來自C專家程式設計)

2021-08-30 10:08:10 字數 1293 閱讀 6023

c語言由於其形式的靈活、符號的復用以及優先順序的複雜性導致了某些宣告晦澀難懂。比如下面兩種宣告:

char *const *(next) ();

char *(*c[10]) (int **p);

對於不僅是初學者來說都不是簡單的問題。那麼我們應該如何來解析這種宣告呢?

在《c專家程式設計》的page65給出了乙個較為通用的方法,細細體會,受益匪淺。

方法如下:

步驟1.取最左邊的識別符號(比如變數的識別符號) 表示識別符號是

步驟2.檢視識別符號右邊的下乙個符號,如果是方括號 對於每一對,表示「……的陣列」

步驟3.如果是乙個左括號 與右括號組成函式引數的放置,確定這是乙個返回……的函式

步驟4.檢視識別符號左邊的符號,如果是左括號 這個括號把已經處理的宣告組合在一起,知道遇見對應的右括號,然後從第2步開始

步驟5.如果左邊符號是下述之一

const

volatile

* 繼續向左邊讀符號,知道所讀不是這三者之一(const表示唯讀,volatile表示「volatile」,*表示指向……的指標)。然後重複第4步

步驟6.剩下的符號形成宣告的基本型別 一併讀取,如static unsigned int

***********************************====

備註:上述方法有回返處理的過程。讀起來比較難懂一點。不果根據我的個人經驗,大家可以記住兩點;1.首先找出最左邊的那個識別符號——變數最常見。2.讀取完識別符號首先檢視識別符號的右邊,如果有圓括弧則為函式,為是陣列,然後再看左邊的符號。

再簡練點就是:最左邊識別符號,其右、其左。

***********************************====

解析上述宣告:

char *const *(*next) ();

找到最左邊的識別符號next,看其右,非()或而是);看其左,為*,說明next是乙個指標變數。再看其左,為(,那麼再看其右,(),函式。這個指標變數指向乙個函式。看其右, *,說明這個函式返回乙個指標,這個指標指向乙個char的常量指標(char *const)。

char *(*c[10]) (int **p);

利用現有的經驗來得更簡單和快捷:

這是乙個陣列c[10],這個陣列為指標型別(每個元素都是乙個指標變數),每個指標變數指向乙個引數為int **p,返回值為char *的函式。

分析C語言宣告

void signal int sig,void handler int int 分析如下形式 void signal int signal是乙個函式,它的返回值是乙個函式指標,而它的引數中有乙個函式指標形式void handler int 借助於typedef來進行簡化如下 定義函式指標返回值是v...

C語言宣告解析方法

1.c語言宣告的單獨語法成份 宣告器是c語言宣告的非常重要成份,他是所有宣告的核心內容,簡單的說 宣告器就是識別符號以及與它組合在一起的任何指標 函式括號 陣列下表等,為了方便起見這裡進行分類表示。1 指標 1 2 const 3 volatile 4 const volatile 5 volati...

如何分析複雜的C語言宣告

宣告從它的名字開始讀取,然後按照優先順序順序以此讀取 優先順序從高到低依次是 宣告中被括號擴起來的那部分 字尾操作符 字首引數操作符 如果const和volatile關鍵字的後面緊跟著型別說明符 如int,long 那麼 它作用於型別說明符.其他情況下,從const和volatile關鍵字作用於它左...