結構宣告
「結構宣告」會命名一個類型,並指定可能具有不同類型之變數值的序列 (稱為結構的「成員」或「欄位」)。 選擇性識別項 (稱為「標記」) 會為結構類型提供名稱,並且可以在後續參考結構類型時使用。 該結構類型的變數會保留由該類型定義的整個序列。 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
(標籤) 可用來參考其他位置定義的結構類型。 在此情況下,只要定義可見, 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
結構有三個成員:name
、id
和 class
。 成員 name
是 20 個專案陣列,而且 id
class
是具有 int
和 long
類型的簡單成員。 識別項 employee
為結構識別項。
struct employee student, faculty, staff;
此範例定義三個結構變數:student
、faculty
和 staff
。 每個結構具有三個成員的相同清單。 成員宣告為具有結構類型 employee
,定義在先前的範例中。
struct /* Defines an anonymous struct and a */
{ /* structure variable named complex */
float x, y;
} complex;
結構 complex
有兩個 float
具有 型別的成員和 y
x
。 結構類型沒有標記,因此為未命名或匿名的。
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
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應