《Expert C Programming》(《C專家編程》)中提到C語言聲明的優先級規則如下:
A 聲明從它的名字開始讀取,然後按照優先級順序依次讀取;
B 優先級從高到低依次是:
B.1 聲明中被括號括起來的那部分;
B.2 後綴操作符:括號()表示這是一個函數,而方括號[]表示這是一個數組;
B.3 前綴操作符:星號*標識“指向……的指針”;
C 如果const和(或者)volatile關鍵字的後面緊跟類型說明符(如int,long等),那麼它作用於類型說明符,在其他情況下,const和(或)volatile關鍵字作用於它左邊緊鄰的指針星號。
並舉例說明:char * const * (*next)();
A next ——next為聲明的名字
B.1 (*next) ——next為一個指向……的指針
B.2 (*next)() ——next是一個函數指針
B.3 *(*next)() ——next是一個函數指針,這個函數返回一個指向……的指針
C char * const ——指向字符類型的常量指針
故 char * const *(*next)();的含義就是: next是一個函數指針,這個函數返回一個指向字符類型的常量指針
下面我們來自己分析一個聲明:
int(*foo())[];
自己先推導一下,然後看看結果結果:foo為一個函數,這個函數返回一個指向整型數組的指針。對不對呢?下面我們來看具體的推導過程:
A foo ——foo為聲明的名字
B.2 foo() ——foo為一個函數
B.3 (*foo()) ——foo為一個函數,這個函數返回一個指向……的指針
B.2 (*foo())[] ——foo為一個函數,這個函數返回一個指向數組的指針
C int (*foo())[] ——foo為一個函數,這個函數返回一個指向整型數組的指針