我正在尝试理解C语言中的struct
。我无法理解下面这个定义的意思。为什么我们要把aCard
,deck[ ]
和*cardPtr
排除在外呢?将它们包含进去和排除在外有什么区别?
struct card {
char *face;
char *suit;
} aCard, deck[52], *cardPtr;
我正在尝试理解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定义结构体?(它涉及到了typedef struct { ... } Foo;
和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"
struct card {
char *face;
char *suit;
};
这里的face
和suit
是成员变量。请注意,结构声明不会保留任何存储空间;它只是描述了一个结构的模板。
结构声明定义了一种类型。终止成员列表的右括号后面可以跟一个变量列表。所以,在你的情况下:
....
} aCard, deck[52], *cardPtr;
aCard
、deck[52]
和 *cardPtr
是 struct card
类型的变量。
由于结构体声明被标记为 card
,因此在定义结构体实例时可以在后面使用该标记。例如,给定上面的结构体声明:
struct card someCard;
定义了一个变量someCard
,它是struct card
类型的结构体。
或者,您可以使用typedef
声明并将其用于定义其类型的变量。
1)
根据定义 - 结构体是一组一个或多个变量的集合,可能是不同类型的,在单个名称下分组在一起。
根据C标准#6.2.5 [Types]:
结构类型描述了一组按顺序分配的非空成员对象(在某些情况下为不完整数组),每个对象都具有可选指定的名称和可能不同的类型。
.....
.....
算术类型和指针类型统称为标量类型。数组和结构类型统称为聚合类型。46)
A
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
在结构体节点中。
typedef struct { } card_t;
...card_t card;
。 - Lundinstruct card { ... }
...struct card drawn;
(这是我更喜欢的方式,但这更多是样式问题) - anon