解譯更複雜的多個宣告
您可以將任何宣告子括在括號來指定特定的解譯的"複雜宣告 」。 複雜的宣告子是以一個以上的陣列、 指標或函式修飾詞來限定識別項。 您可以將不同組合中的陣列、 指標,以及函式修飾詞套用至單一識別項。 一般typedef可能會用來簡化宣告。 請參閱 Typedef 宣告。
在解釋複雜的多個宣告,括號和括號 (也就是右邊的識別項的修飾詞) 高於星號 (也就是左邊的識別項的修飾詞)。 括號和括號有相同的優先順序,並將相關聯從左到右。 完全解譯宣告之後,型別規範會套用的最後一個步驟。 使用括號,您可以覆寫預設的關聯順序,並強制特定轉譯。 永遠不會在括號內,但使用,括住單獨識別項名稱。 這可能會解譯成參數清單。
一個簡單的方法,來解譯複雜的多個宣告是讀取它們 」 時,內部 」 使用下列的四個步驟:
啟動與識別項,並直接以方括號或括號 (如果有的話) 的查詢。
解譯這些括號或括號,然後看一下左邊的星號。
如果您遇到任何階段的右括號,請返回,並將 1 和 2 的規則套用至在括號內的所有項目。
套用型別規範。
char *( *(*var)() )[10]; ^ ^ ^ ^ ^ ^ ^ 7 6 4 2 1 3 5
在這個範例中,這些步驟的順序編號,並可依如下解譯:
識別項var宣告為
變數的指標,
傳回的函式
變數的指標,
10 個元素,也就是一個陣列
指標
char值。
範例
下列範例會說明其他複雜的宣告,並顯示括號會如何影響宣告的意義。
int *var[5]; /* Array of pointers to int values */
陣列修飾詞中有更高的優先順序,比使用指標修飾詞,所以var宣告為陣列。 指標修飾詞套用至的陣列元素型別 ; 因此,陣列元素會指向int的值。
int (*var)[5]; /* Pointer to array of int values */
在這個宣告中的var,括號內提供指標的修飾詞較高優先順序比陣列修飾詞,並var宣告為五個陣列的指標int值。
long *var( long, long ); /* Function returning pointer to long */
函式修飾詞也有更高的優先順序比指標修飾詞,因此這項宣告的var宣告var是傳回的指標的函式長的值。 此函式宣告為採用兩個長做為引數的值。
long (*var)( long, long ); /* Pointer to function returning long */
這個範例是類似於前一個項目。 括號內提供指標的修飾詞較高優先順序低於函式修飾詞,以及var宣告為傳回的函式指標長值。 同樣地,函式會接受兩個長引數。
struct both /* Array of pointers to functions */
{ /* returning structures */
int a;
char b;
} ( *var[5] )( struct both, struct both );
陣列的元素不能是函式,但這個宣告會示範如何改為宣告的函式的指標陣列。 在這個範例中, var宣告為五個函式指標會傳回含有兩個成員的結構陣列。 函式的引數宣告兩個結構具有相同的結構型別, both。 請注意,周圍的括號*var[5]所需。 沒有它們,宣告是不合法嘗試宣告陣列的函式,如下所示:
/* ILLEGAL */
struct both *var[5]( struct both, struct both );
下列陳述式宣告指標陣列。
unsigned int *(* const *name[5][10] ) ( void );
name陣列的組織中的多維陣列的元素 50。 項目都是常數指標的指標。 這個常數的指標正在指出沒有參數,並傳回一個不帶正負號的型別指標的函式。
下一個範例會傳回三個陣列的指標的函式雙的值。
double ( *var( double (*)[3] ) )[3];
在這個宣告中,函式傳回陣列的指標,因為函式傳回的陣列不合法。 在此var宣告為函式傳回三個陣列的指標雙精度浮點的值。 此函式var接受一個引數。 引數,則傳回的值,像是為三個陣列的指標雙的值。 引數型別由所提供複雜抽象宣告子。 引數型別中的星號括弧是必要的。 如果沒有,引數型別是以三個指標陣列雙的值。 討論區及抽象的多個宣告的範例,請參閱抽象的宣告子。
union sign /* Array of arrays of pointers */
{ /* to pointers to unions */
int x;
unsigned y;
} **var[5][5];
如上述範例所示,指標可以指向另一個指標,,而且陣列可以包含元素的陣列。 在此var是五個元素的陣列。 每個項目是五個元素陣列含有兩個成員的等位的指標的指標。
union sign *(*var[5])[5]; /* Array of pointers to arrays
of pointers to unions */
這個範例會示範如何的括號位置會變更宣告的意義。 在這個範例中, var是五個元素陣列的等位的指標的五個元素陣列的指標。 如需如何使用範例typedef若要避免複雜的宣告,請參閱 Typedef 宣告。