我试图用C理解struct
。下面我对这个定义一无所知。为什么我们将aCard
,deck[ ]
和*cardPtr
留在外面?将它们包含进去和保留它们有什么区别?
struct card {
char *face;
char *suit;
} aCard, deck[52], *cardPtr;
答案 0 :(得分:73)
您正在混淆。 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
,请查看:Why should we typedef a struct so often in C?(涉及typedef struct { ... } Foo;
与struct Foo {...}
的辩论)。
答案 1 :(得分:28)
您的代码片段可以这样写:
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"
答案 2 :(得分:18)
尽管,这个问题已经回答了,但我发布了答案,因为我认为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
的结构。
或者,您可以typedef
使用结构声明,并使用它来定义其类型的变量。
1)
按定义-结构是一个或多个变量(可能是不同类型)的集合,以单个名称分组在一起。
根据C标准#6.2.5 [类型]:
结构类型描述成员对象的顺序分配的非空集(在某些情况下,还包括不完整的数组),每个成员对象都有一个可选的指定名称和可能不同的类型。
.....
.....
算术类型和指针类型统称为标量类型。数组和结构类型统称为集合类型。46)
答案 3 :(得分:7)
A
struct card {
char *face;
char *suit;
}
就像int
,但它是用户定义的,并且
aCard, deck[52], *cardPtr;
是变量名,例如,
int aCard, deck[41], *cardPtr;
答案 4 :(得分:1)
您已经声明了三个变量。 aCard
的类型为struct card
,deck
的类型为struct card[52]
,而cardPtr
的类型为struct card *
答案 5 :(得分:0)
aCard
和您提到的其他变量是类型struct card
的变量,并且每个变量都包含char *face
和char *suit
。因此,某个变量如何能够包含自身,即aCard
位于结构节点内部。