在 C 語言中,變數宣告的寫法看似簡單,實際上卻藏著相當多細節。當指標、陣列與函式型別交錯出現時,一行宣告往往讓人難以直觀理解其真正含義。為了解決這個問題,從「右讀到左規則」提供了一套清晰且系統化的閱讀方式,幫助我們逐步拆解複雜的型別宣告。
透過掌握這個規則,不僅能提升程式碼的理解速度,也能在撰寫時更精準地表達資料結構。我們將從基礎宣告出發,逐步說明從右讀到左的規則邏輯,並透過實際例子講解,讓你真正看懂每一行 C 語言的變數宣告。
1. C 語言,宣告變數從右讀到左規則
規則步驟:
- 先從變數名稱開始
- 先往右看,再往左看
- 遇到左括號,就折返往右看
- 遇到右括號,就折返往左看
- 重複上述,直到讀完
2. 從簡單到複雜的範例
◉ 範例一:
char p;
解讀步驟:
① 從 p 開始 ② 往右:沒有符號 ③ 往左:char ➜ char 型別
┌---- ② ⇢往右:沒有符號 char p; | └----- ① 從 p 開始 └--------- ③ ⇠往左:char ➜ char 型別
因此,「p 是一個 char 型別的變數」
◉ 範例二:
char *p;
解讀步驟:
① 從 p 開始 ② 往右:沒有符號 ③ 往左:* ➜ 指標 ④ 往左:char ➜ char 型別
┌---- ② ⇢往右:沒有符號 char *p; | |└----- ① 從 p 開始 | └------ ③ ⇠往左:* ➜ 指標 └---------- ④ ⇠往左:char 型別
因此,「p 是一個指向 char 型別的指標變數」
◉ 範例三:
char p[6];
解讀步驟:
① 從 p 開始 ② 往右:[6] ➜ 大小為 6 的陣列 ③ 往左:char ➜ char 型別
┌---- ② ⇢[6] ➜ 大小為 6 的陣列 char p[6]; | └----- ① 從 p 開始 └--------- ③ ⇠往左:char 型別
因此,「p 是一個含有 6 個 char 的陣列」
◉ 範例四:
char *p[6];
解讀步驟:
① 從 p 開始 ② 往右:[6] ➜ 大小為 6 的陣列 ③ 往左:* ➜ 指標 ④ 往左:char ➜ char 型別
┌----- ② ⇢[6] ➜ 大小為 6 的陣列 char *p[6]; | |└------ ① 從 p 開始 | └------- ③ ⇠往左:* ➜ 指標 └----------- ④ ⇠往左:char 型別
因此,「p 是一個含有 6 個指向 char 指標的陣列」
◉ 範例五:
char (*p)[6];
解讀步驟:
① 從 p 開始 ② 往右:遇到 ),折返往左 ③ 往左:* ➜ 指標 ④ 往左:遇到 ( 折返往右 ⑤ 往右:[6] ➜ 大小為 6 的陣列 ⑥ 往左:char ➜ char 型別
┌----- ② ⇢往右:遇到 ),折返往左
|┌---- ⑤ ⇢往右:[6] ➜ 大小為 6 的陣列
char (*p)[6];
| ||└------ ① 從 p 開始
| |└------- ③ ⇠往左:* ➜ 指標
| └-------- ④ ⇠往左:遇到 ( 折返往右
└------------ ⑥ ⇠往左:char 型別
因此,「p 是一個含有 6 個 char 陣列的指標」
◉ 範例六:
char (*p)(int, int);
解讀步驟:
① 從 p 開始 ② 往右:遇到 ),折返往左 ③ 往左:* ➜ 指標 ④ 往左:遇到 ( 折返往右 ⑤ 往右:(int, int) ➜ 接受兩個 int 參數的函式 ⑥ 往左:char ➜ char 型別
┌----- ② ⇢往右:遇到 ),折返往左
|┌---- ⑤ ⇢往右:(int, int) ➜ 接受兩個 int 參數的函式
char (*p)(int, int);
| ||└------ ① 從 p 開始
| |└------- ③ ⇠往左:* ➜ 指標
| └-------- ④ ⇠往左:遇到 ( 折返往右
└------------ ⑥ ⇠往左:char 型別
因此,「p 是一個指向接受兩個 int 參數且回傳 char 函式的指標」
◉ 範例七:
char **p;
解讀步驟:
① 從 p 開始 ② 往右:沒有符號 ③ 往左:* ➜ 指標 ④ 往左:* ➜ 指標 ⑤ 往左:char ➜ char 型別
┌---- ② ⇢往右:沒有符號 char **p; | ||└----- ① 從 p 開始 | |└------ ③ ⇠往左:* ➜ 指標 | └------- ④ ⇠往左:* ➜ 指標 └----------- ⑤ ⇠往左:char 型別
因此,「p 是一個指向(指向 char 的指標)的指標」
3. 結論
經過以上範例的練習,相信已經能逐步掌握在 C 語言 中解析變數宣告的方式。透過從「右讀到左規則」的實際應用,能在面對各種指標、陣列與函式組合時,具備清楚拆解與判讀的能力。
