首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言複雜宣告解析法:優先級規則與實戰範例

     編輯:關於C語言

宣告組成元素

  • 型別指定符:int、char、const、volatile 等
  • 宣告子:識別碼 + 指標 *、陣列 []、函數 ()、括號 ()

優先級規則(由高到低)

  1. 括號 ( ) 內的部分
  2. 後綴運算子:()(函數)、[](陣列) —— 右結合
  3. 前綴運算子:*(指標) —— 右結合
  4. 型別限定詞 const/volatile:緊鄰型別時修飾型別,否則修飾左側指標

口訣:從變數名開始,按優先級「向右再向左」螺旋解讀

實戰範例逐步拆解

範例 1:char * const *(*next)();

  1. 找到變數名 next
  2. (*next) → next 是指標
  3. (*next)() → 指向函數的指標,該函數傳回…
  4. * (*next)() → 傳回指標
  5. char * const * → 指向 char 的 常數指標(指標本身不可修改)

結論:next 是一個指標,指向一個函數,該函數傳回一個「指向 char 的常數指標」。

範例 2:int *(*p[])();

  1. 變數名 p
  2. (*p[]) → p 是陣列,元素為指標
  3. (*p[])() → 陣列元素為「指向函數的指標」
  4. int *(*p[])() → 函數傳回 int *

結論:p 是一個陣列,每個元素是指向函數的指標,該函數傳回 int *。

範例 3:void (*signal(int sig, void (*func)(int)))(int);

  1. 變數名 signal
  2. signal(int sig, void (*func)(int)) → signal 是函數,參數為 int 和函數指標 func
  3. (*signal(...))(int) → 傳回函數指標,該函數接受 int 傳回 void

結論:signal 是一個函數,接受訊號編號與處理函數指標,傳回前一個處理函數指標(標準 signal() 簽章)。

const/volatile 修飾規則速查

const char *p;      // p 是指標,指向 const char(常數指標)
char const *p;      // 同上
char * const p;     // p 是 const 指標,指向 char(指標常數)
const char * const p; // 指向 const char 的 const 指標

工具推薦

  • cdecl:命令列工具,輸入宣告輸出英文解釋
  • 線上 cdecl.org
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved