《Expert C Programming》(《C專(zhuān)家編程》)中提到C語(yǔ)言聲明的優(yōu)先級(jí)規(guī)則如下:
A 聲明從它的名字開(kāi)始讀取,然后按照優(yōu)先級(jí)順序依次讀取;
B 優(yōu)先級(jí)從高到低依次是:
B.1 聲明中被括號(hào)括起來(lái)的那部分;
B.2 后綴操作符:括號(hào)()表示這是一個(gè)函數(shù),而方括號(hào)[]表示這是一個(gè)數(shù)組;
B.3 前綴操作符:星號(hào)*標(biāo)識(shí)“指向...的指針”;
C 如果const和(或者)volatile關(guān)鍵字的后面緊跟類(lèi)型說(shuō)明符(如int,long等),那么它作用于類(lèi)型說(shuō)明符,在其他情況下,const和(或)volatile關(guān)鍵字作用于它左邊緊鄰的指針星號(hào)。
并舉例說(shuō)明:char * const * (*next)();
A next ---next為聲明的名字
B.1 (*next) ---next為一個(gè)指向...的指針
B.2 (*next)() ---next是一個(gè)函數(shù)指針
B.3 *(*next)() ---next是一個(gè)函數(shù)指針,這個(gè)函數(shù)返回一個(gè)指向...的指針
C char * const ---指向字符類(lèi)型的常量指針
故 char * const *(*next)();的含義就是: next是一個(gè)函數(shù)指針,這個(gè)函數(shù)返回一個(gè)指向字符類(lèi)型的常量指針
下面我們來(lái)自己分析一個(gè)聲明:
int(*foo())[];
自己先推導(dǎo)一下,然后看看結(jié)果結(jié)果:foo為一個(gè)函數(shù),這個(gè)函數(shù)返回一個(gè)指向整型數(shù)組的指針。對(duì)不對(duì)呢?下面我們來(lái)看具體的推導(dǎo)過(guò)程:
A foo ---foo為聲明的名字
B.2 foo() ---foo為一個(gè)函數(shù)
B.3 (*foo()) ---foo為一個(gè)函數(shù),這個(gè)函數(shù)返回一個(gè)指向...的指針
B.2 (*foo())[] ---foo為一個(gè)函數(shù),這個(gè)函數(shù)返回一個(gè)指向數(shù)組的指針
C int (*foo())[] ---foo為一個(gè)函數(shù),這個(gè)函數(shù)返回一個(gè)指向整型數(shù)組的指針