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

為何不精通 C?(03) 深度剖析複雜聲明讀法

     編輯:關於C語言

為何不精通 C?(03) 深度剖析複雜聲明讀法

面對 char* const *(*next)() 這類聲明,掌握**通用讀法**即可游刃有餘。

核心讀法:從變量名出發,遇右括號或結束向左,遇左括號向右


char* const *(*next)();
     │    │  │  │  │
     │    │  │  │  └─ 5. 無參數
     │    │  │  └──── 4. 指向函數
     │    │  └─────── 3. 是一個指針
     │    └────────── 2. const 修飾指針 (指針不可變)
     └─────────────── 1. 指向 char* 類型

讀法口訣:next 是一個指針,指向一個無參函數,該函數返回一個指針,該指針指向 char 類型,且該返回指針是常量 (不可修改指向)。

更多例子

  • int *ap[]:ap 是數組 → 元素是指針 → 指向 int。
  • const int *p:p 是指針 → 指向 const int (值不可變)。
  • int *const p:p 是常量指針 → 指向 int (指針不可變)。

極限挑戰


int * (* (*fp1)())[10]();

逐層拆解:fp1 是指針 → 指向函數 → 函數返回指針 → 指向數組(10元素) → 數組元素是指針 → 指向函數 → 函數返回 int。
實戰中極少見,了解讀法即可。

typedef:類型別名神器

  • 為類型創建別名,**不創建新類型**。
  • 區別 #define:typedef 參與類型系統,可與類型說明符組合 (如 unsigned tInt),連續聲明保證類型一致 (typedef int* pInt; pInt a, b; 皆為 int*),#define 純文本替換無此保障。

實戰:簡化信號處理函數聲明


// 原始難讀聲明
void (*signal(int sig, void (*func)(int)))(int);

// 使用 typedef
typedef void (*SigHandler)(int);
SigHandler signal(int sig, SigHandler func);

清晰明了:signal 接收信號碼與處理函數指針,返回前一處理函數指針。

結構體配合 typedef


typedef struct MyStruct { ... } MyType;
// 等價於 struct MyStruct,少寫 struct 關鍵字

聲明 vs 定義

  • 定義:分配內存,僅能出現一次,是特殊的聲明。
  • 聲明:引用他處定義的實體,可多處出現,常帶 extern。

指針/數組聲明即定義 (確定移動步長/長度),故跨文件聲明定義**必須匹配** (見下期)。

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