为什么我们从花括号中留下一些结构变量?

Bel*_*rus 38 c

我试图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有成员facesuit.但是使用该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)

这里facesuit成员变量.请注意,结构声明不保留存储空间; 它只描述了一个结构的模板.

结构声明定义了一种类型.终止成员列表的右大括号后面可能跟一个变量列表.所以,在你的情况下:

....
} 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)


Bla*_*ght 6

一个

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)

  • `struct card`和`int`确实都是两种类型,但它们不是等价的.我想澄清这一点,因为我认为这个答案可能会被一些初学者或不熟练英语的人误读. (3认同)