共用方式為


解譯更複雜的多個宣告

您可以將任何宣告子括在括號來指定特定的解譯的"複雜宣告 」。 複雜的宣告子是以一個以上的陣列、 指標或函式修飾詞來限定識別項。 您可以將不同組合中的陣列、 指標,以及函式修飾詞套用至單一識別項。 一般typedef可能會用來簡化宣告。 請參閱 Typedef 宣告

在解釋複雜的多個宣告,括號和括號 (也就是右邊的識別項的修飾詞) 高於星號 (也就是左邊的識別項的修飾詞)。 括號和括號有相同的優先順序,並將相關聯從左到右。 完全解譯宣告之後,型別規範會套用的最後一個步驟。 使用括號,您可以覆寫預設的關聯順序,並強制特定轉譯。 永遠不會在括號內,但使用,括住單獨識別項名稱。 這可能會解譯成參數清單。

一個簡單的方法,來解譯複雜的多個宣告是讀取它們 」 時,內部 」 使用下列的四個步驟:

  1. 啟動與識別項,並直接以方括號或括號 (如果有的話) 的查詢。

  2. 解譯這些括號或括號,然後看一下左邊的星號。

  3. 如果您遇到任何階段的右括號,請返回,並將 1 和 2 的規則套用至在括號內的所有項目。

  4. 套用型別規範。

    char *( *(*var)() )[10];
     ^   ^  ^ ^ ^   ^    ^
     7   6  4 2 1   3    5
    

在這個範例中,這些步驟的順序編號,並可依如下解譯:

  1. 識別項var宣告為

  2. 變數的指標,

  3. 傳回的函式

  4. 變數的指標,

  5. 10 個元素,也就是一個陣列

  6. 指標

  7. 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 宣告

請參閱

概念

宣告和型別