《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為一個函數,這個函數返回一個指向整型數組的指針