解釋宣告

C 的獨特語法特性是宣告映象使用宣告的物件,就像它在普通表示式中一樣。

具有相同優先順序和關聯性的以下運算子集在宣告符中重用,即:

  • 一元 * dereference 運算子,表示指標;
  • 二進位制 [] 陣列索引運算子,表示一個陣列;
  • (1 + n)-ary ()函式呼叫運算子表示函式;
  • () 分組括號,它覆蓋其餘列出的運算子的優先順序和相關性。

以上三個運算子具有以下優先順序和關聯性:

操作者 相對偏好 關聯性
[](陣列順序) 1 左到右
()(函式呼叫) 1 左到右
*(取消引用) 2 右到左

在解釋宣告時,必須從識別符號向外開始,並按照上表以正確的順序應用相鄰的運算子。運算子的每個應用程式都可以用以下英文單詞代替:

表達 解釋
thing[X] 一系列大小的 X of …
thing(t1, t2, t3) 一個功能採取 t1t2t3 並返回…
*thing 一個指向…的指標

因此,英語解釋的開頭將始終以識別符號開頭,並以宣告左側的型別結束。

例子

char *names[20];

[] 優先於*,所以解釋是:names 是一個指向 char 的指標大小為 20 的指標陣列。

char (*place)[10];

如果使用括號覆蓋優先順序,則首先應用*place 是指向 char 的 10 號資料的指標。

int fn(long, short);

這裡沒有優先擔心:fn 是一個採用 longshort 引數和返回 int 的函式。

int *fn(void);

首先應用 ()fn 是一個採用 void 並返回指向 int 的函式。

int (*fp)(void);

覆蓋 () 的優先順序:fp 是指向 void 並返回 int 的函式的指標。

int arr[5][8];

多維陣列不是規則的例外; [] 運算子根據表中的關聯性以從左到右的順序應用:arr 是一個大小為 5 的陣列,大小為 8 的 int

int **ptr;

兩個解除引用運算子具有相同的優先順序,因此關聯性生效。運算子按從右到左的順序應用:ptr 是指向 int 的指標。

多個宣告

逗號可以用作分隔符 ,,以便在單個語句中分隔多個宣告。以下語句包含五個宣告:

int fn(void), *ptr, (*fp)(int), arr[10][20], num;

上例中宣告的物件是:

  • fn:採取 void 並返回 int 的功能;
  • ptr:指向 int 的指標;
  • fp:指向 int 並返回 int 的函式的指標;
  • arr:一個大小為 10 的陣列,大小為 20;
  • numint

替代解釋

因為宣告映象使用,所以宣告也可以根據可以應用於物件的運算子和該表示式的最終結果型別來解釋。位於左側的型別是應用所有運算子後產生的最終結果。

/*
 * Subscripting "arr" and dereferencing it yields a "char" result.
 * Particularly: *arr[5] is of type "char".
 */
char *arr[20];

/*
 * Calling "fn" yields an "int" result.
 * Particularly: fn('b') is of type "int".
 */
int fn(char);

/*
 * Dereferencing "fp" and then calling it yields an "int" result.
 * Particularly: (*fp)() is of type "int".
 */
int (*fp)(void);

/*
 * Subscripting "strings" twice and dereferencing it yields a "char" result.
 * Particularly: *strings[5][15] is of type "char"
 */
char *strings[10][20];