我试图struct在C中理解.我无法理解下面这个定义.我们为什么要离开aCard,deck[ ]并*cardPtr出?将他们包括在内并将其排除之间有什么区别?
struct card {
char *face;
char *suit;
} aCard, deck[52], *cardPtr;
Run Code Online (Sandbox Code Playgroud)
Mic*_*ann 73
你搞混了.A 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;
Run Code Online (Sandbox Code Playgroud)
为了typedef看看:为什么要使用C的typedef一个struct经常?(它进入了typedef struct { ... } Foo;vs struct Foo {...}辩论).
Jab*_*cky 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"
Run Code Online (Sandbox Code Playgroud)
H.S*_*.S. 18
虽然这个问题已经回答了,但我发布了答案,因为我认为OP在结构声明和结构类型变量的定义方面存在疑问.
如果您不知道C中的结构是什么,请查看下面的1).
关键字struct引入了一个结构声明,它是用大括号括起来的声明列表.名为结构标记的可选名称可以跟在struct之后.因此,这是一个结构声明:
struct card {
char *face;
char *suit;
};
Run Code Online (Sandbox Code Playgroud)
这里face和suit是成员变量.请注意,结构声明不保留存储空间; 它只描述了一个结构的模板.
结构声明定义了一种类型.终止成员列表的右大括号后面可能跟一个变量列表.所以,在你的情况下:
....
} aCard, deck[52], *cardPtr;
Run Code Online (Sandbox Code Playgroud)
aCard,deck[52]和*cardPtr是类型的变量 struct card.
由于您的结构声明使用name card标记,card因此稍后可以在结构实例的定义中使用该标记.例如,鉴于上述结构的声明card,
struct card someCard;
Run Code Online (Sandbox Code Playgroud)
定义一个变量someCard,它是一个类型的结构struct card.
或者,您可以typedef使用结构声明并使用它来定义其类型的变量.
1)
根据定义 - 结构是一个或多个变量的集合,可能是不同类型的变量,在一个名称下组合在一起.
根据C标准#6.2.5 [类型]:
结构类型描述顺序分配的非空成员对象集(并且在某些情况下,是不完整的数组),每个成员对象具有可选地指定的名称并且可能具有不同的类型.
.....
.....
运算类型和指针类型统称为标量类型.数组和结构类型统称为聚合类型.46)
一个
struct card {
char *face;
char *suit;
}
Run Code Online (Sandbox Code Playgroud)
就像int,但它是用户定义的,并且
aCard, deck[52], *cardPtr;
Run Code Online (Sandbox Code Playgroud)
是变量名,例如,
int aCard, deck[41], *cardPtr;
Run Code Online (Sandbox Code Playgroud)