共用方式為


結構宣告

「結構宣告」會命名一個類型,並指定可能具有不同類型之變數值的序列 (稱為結構的「成員」或「欄位」)。 選擇性識別項 (稱為「標記」) 會為結構類型提供名稱,並且可以在後續參考結構類型時使用。 該結構類型的變數會保留由該類型定義的整個序列。 C 中的結構類似於其他語言中稱為「記錄」的類型。

語法

struct-or-union-specifier:
struct-or-unionidentifier選擇{struct-declaration-list}
struct-or-union identifier

struct-or-union:
struct
union

struct-declaration-list:
struct-declaration
struct-declaration-list struct-declaration

struct-declaration:
specifier-qualifier-list struct-declarator-list ;

specifier-qualifier-list:
type-specifierspecifier-qualifier-list選擇
type-qualifierspecifier-qualifier-list選擇

struct-declarator-list:
struct-declarator struct-declarator-list , struct-declarator

struct-declarator:
declarator
type-specifierdeclarator選擇:constant-expression

結構類型的宣告不會為 結構設定空格。 它只是結構變數稍後宣告的範本。

先前定義的 identifier (標籤) 可用來參考其他位置定義的結構類型。 在此情況下,只要定義可見, struct-declaration-list 就無法重複。 為結構類型的結構和 typedef 宣告的指標,可以在定義結構類型之前使用結構標記。 不過,必須實際使用欄位的大小之前進行結構定義。 此用法是型別和型別標記的不完整定義。 若要讓這個定義完整,類型定義稍後必須出現在相同範圍中。

struct-declaration-list會指定結構成員的類型和名稱。 自 struct-declaration-list 變數包含一或多個變數或位欄位宣告。

struct-declaration-list 宣告的每個變數都會定義為結構類型的成員。 內的 struct-declaration-list 變數宣告的格式與本節所討論的其他變數宣告相同,不同之處在于宣告不能包含儲存體類別規範或初始化運算式。 除了類型 void、不完整的類型或函式類型之外,結構成員可以擁有任何變數類型。

成員無法宣告為具有其所顯示之結構的類型。 不過,只要結構類型具有標記,成員就可以宣告為其所在位置中結構類型的指標。 它可讓您建立結構的連結清單。

結構遵循與其他識別項相同的範圍。 結構識別項必須與具有相同可視性的其他結構、等位和列舉標記有所區別。

struct-declaration中的每個 都必須在清單中是唯一 struct-declaration-list 的。 不過,中的 struct-declaration-list 識別碼名稱不一定不同于一般變數名稱,或與其他結構宣告清單中的識別碼不同。

巢狀結構也可以存取,如同它們是在檔案範圍層級中宣告一樣。 例如,指定以下宣告:

struct a
{
    int x;
    struct b
    {
      int y;
    } var2;
} var1;

這些宣告都是合法的:

struct a var3;
struct b var4;

範例

這些範例說明結構宣告:

struct employee   /* Defines a structure variable named temp */
{
    char name[20];
    int id;
    long class;
} temp;

employee 結構有三個成員:nameidclass。 成員 name 是 20 個專案陣列,而且 idclass 是具有 intlong 類型的簡單成員。 識別項 employee 為結構識別項。

struct employee student, faculty, staff;

此範例定義三個結構變數:studentfacultystaff。 每個結構具有三個成員的相同清單。 成員宣告為具有結構類型 employee,定義在先前的範例中。

struct           /* Defines an anonymous struct and a */
{                /* structure variable named complex  */
    float x, y;
} complex;

結構 complex 有兩個 float 具有 型別的成員和 yx 。 結構類型沒有標記,因此為未命名或匿名的。

struct sample   /* Defines a structure named x */
{
    char c;
    float *pf;
    struct sample *next;
} x;

結構的前兩個 char 成員是變數和值的指標 float 。 第三個成員 next 宣告為所定義結構類型 (sample) 的指標。

匿名結構在不需要標記名稱時很有用,例如當一個宣告定義所有結構實例時。 例如:

struct
{
    int x;
    int y;
} mystruct;

內嵌結構通常是匿名的。

struct somestruct
{
    struct    /* Anonymous structure */
    {
        int x, y;
    } point;
    int type;
} w;

Microsoft 特定的

編譯器允許使用一個可變大小或大小為零的陣列,做為結構的最後一個成員。 如果常數陣列的大小在各種情況下使用時不同,則很有用。 此類結構的宣告如下所示:

struct identifier { set-of-declarations type array-name []; };

可變大小陣列只可以顯示為結構的最後一個成員。 只要未在任何封閉結構中宣告其他成員,包含可變大小陣列的宣告可以巢狀的方式放置於其他結構內。 不允許這類結構的陣列。 sizeof 運算子,套用至此類型的變數或類型本身時,會假設陣列的大小為 0。

當結構宣告是另一個結構或等位的成員時,也可以指定沒有宣告子。 欄位名稱會提升至封閉結構中。 例如,無名稱的結構如下所示:

struct s
{
    float y;
    struct
    {
        int a, b, c;
    };
    char str[10];
} *p_s;
.
.
.
p_s->b = 100;  /* A reference to a field in the s structure */

如需結構參考的詳細資訊,請參閱 結構和等位成員

END Microsoft Specific

另請參閱

宣告子和變數宣告