[英]Why do we leave some structure variables out of the curly brackets?
我試圖理解C中的struct
。我無法理解下面這個定義。 為什么我們要離開aCard
, deck[ ]
和*cardPtr
? 將他們包括在內並將其排除之間有什么區別?
struct card {
char *face;
char *suit;
} aCard, deck[52], *cardPtr;
你搞混了。 struct card
具有face
和suit
的成員。 但是使用struct card
類型有三個變量,即aCard, deck, cardPtr
。
或者可以寫一個:
typedef struct {
char *face;
char *suit;
} Card;
Card aCard, deck[52], *cardPtr;
// or even
Card aCard;
Card deck[52];
Card *cardPtr;
對於typedef
請看一下: 為什么我們要經常在C中輸入一個結構? (它進入了typedef struct { ... } Foo;
vs struct Foo {...}
辯論。
您的代碼可以像這樣編寫,使其更清晰:
struct card { // define the struct card
char *face;
char *suit;
};
struct card aCard; // declare a variable "aCard" of type "struct card "
struct card deck[52] // declare an array of 52 variables of type "struct card"
struct card *cardPtr; // declare a variable "cardPtr" of type "pointer to struct card"
雖然這個問題已經回答了,但我發布了答案,因為我認為OP對結構聲明和結構類型變量的定義存在疑問。
如果您不知道C中的結構是什么,請查看下面的1) 。
關鍵字struct引入了一個結構聲明,它是用大括號括起來的聲明列表。 名為結構標記的可選名稱可以跟在struct之后 。 因此,這是一個結構聲明:
struct card {
char *face;
char *suit;
};
這里的face
和suit
是成員變量 。 請注意,結構聲明不保留存儲空間; 它只描述了一個結構的模板。
結構聲明定義了一種類型。 終止成員列表的右大括號后面可能跟一個變量列表。 所以,在你的情況下:
....
} aCard, deck[52], *cardPtr;
aCard
, deck[52]
和*cardPtr
是struct card
類型的變量 。
由於您的結構聲明用card
標記,因此標簽card
可以在以后用於結構實例的定義中。 例如,鑒於上述結構card
的聲明,
struct card someCard;
定義一個變量someCard
,它是struct card
類型的struct card
。
或者,你可以typedef
一個結構聲明,並用它來定義其類型的變量。
1)
根據定義 - 結構是一個或多個變量的集合,可能是不同類型的變量,在一個名稱下組合在一起。
根據C標准#6.2.5 [類型]:
結構類型描述順序分配的非空成員對象集(並且在某些情況下,是不完整的數組),每個成員對象具有可選地指定的名稱並且可能具有不同的類型。
.....
.....
算術類型和指針類型統稱為標量類型。 數組和結構類型統稱為聚合類型.46)
一個
struct card {
char *face;
char *suit;
}
就像int
一樣,但它是用戶定義的,並且
aCard, deck[52], *cardPtr;
是變量名,例如,
int aCard, deck[41], *cardPtr;
您已聲明了三個變量。 aCard
是struct card
類型, deck
是struct card[52]
類型, cardPtr
是struct card *
類型
aCard
和你提到的其余部分是struct card
類型的變量,每個變量都包含char *face
和char *suit
。 那么一些變量怎么能包含它自己,即aCard
在struct節點內部。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.