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

不再害怕指針(零):複雜類型聲明讀解法則

     編輯:關於C語言

前言

C 語言聲明採用「聲明模仿使用」原則,運算符優先級決定結合順序。掌握**從變量名出發、按優先級結合**的通用讀解法,任何複雜類型都能秒懂。

運算符優先級 (高 → 低)

  1. () [函數調用]、[] [數組下標] — **最高**
  2. * [指針解引用] — 次高
  3. 基本類型 (int, char...) — 最低

核心口訣

「從變量名起,先結合右邊的 []/(),再結合左邊的 *,最後結合基本類型。」

逐級演示

聲明讀解步驟含義
int p;p → int整型變量
int *p;p → * → int指向 int 的指針
int p[3];p → [3] → int含 3 個 int 的數組
int *p[3];p → [3] → * → int含 3 個「指向 int 的指針」的數組
int (*p)[3];p → * → [3] → int指向「含 3 個 int 的數組」的指針
int **p;p → * → * → int指向「指向 int 的指針」的指針 (二級指針)
int p(int);p → (int) → int參數為 int、返回 int 的函數
int (*p)(int);p → * → (int) → int指向「參數 int、返回 int 的函數」的指針
int *(*p(int))[3];p → (int) → * → [3] → * → int參數 int、返回「指向「含 3 個 int* 的數組」的指針」的函數

關鍵點提煉

  • [] 和 () 同級,**左結合**,比 * 高。
  • 括號 () 可**強行改變結合順序** (如 (*p)[3] vs *p[3])。
  • 多級指針 (**, ***) 現實中極少超過二級,理解 ** 即夠用。
  • 函數指針聲明最易混淆,**括號不可省**:int (*p)(int) ≠ int *p(int)。

實戰綜合練習

// 信號處理函數類型
void (*signal(int sig, void (*handler)(int)))(int);
// 讀解:signal → (int, void(*)(int)) → * → (int) → void
// 含義:參數為 (int, 函數指針),返回「指向 void(int) 函數的指針」的函數

避坑建議

  1. **慎用過度複雜類型** — 損害可讀性,必要時用 typedef 分層:
typedef void (*Handler)(int);
typedef Handler (*SignalFunc)(int, Handler);
SignalFunc signal;
  1. **善用 cdecl / c++decl 工具** — 命令行輸入聲明即可得到英文解釋。
  2. **面試/閱讀庫代碼時**,默念口訣「名→右→左→基本類型」,3 秒內破解。

總結

複雜類型聲明不是天書,而是**優先級規則的直觀體現**。熟練掌握「從變量名出發,按優先級結合」的通用法,配合 typedef 封裝,即可輕鬆駕馭任何 C/C++ 類型聲明。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved