共用方式為


結構宣告

「結構宣告」會命名類型,並指定一連串的變數值(稱為「成員」或「結構」的欄位),這些變數值可以有不同的類型。 稱為「標記」的選擇性標識符會提供結構類型的名稱,並可用於結構型別的後續參考中。 該結構類型的變數會保存該類型所定義的整個序列。 C 中的結構類似於其他語言中稱為「記錄」的類型。

語法

struct-or-union-specifier
struct-or-union identifier 選擇{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-specifier specifier-qualifier-list 選擇
type-qualifier specifier-qualifier-list 選擇

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

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

結構類型的宣告不會為 結構保留空間。 這隻是稍後結構變數宣告的範本。

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

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 有兩個類型為 floatxy和的成員。 結構類型沒有標記,因此未命名或匿名。

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 */

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

結束 Microsoft 特定內容

另請參閱

宣告子和變數宣告