为什么我们将一些结构变量排除在大括号之外?

时间:2018-10-17 09:24:53

标签: c

我试图用C理解struct。下面我对这个定义一无所知。为什么我们将aCarddeck[ ]*cardPtr留在外面?将它们包含进去和保留它们有什么区别?

 struct card {
    char *face;
    char *suit;
 } aCard, deck[52], *cardPtr;

6 个答案:

答案 0 :(得分:73)

您正在混淆。 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;

对于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;
 };

此处facesuit成员变量。注意,结构声明不保留任何存储空间。它仅描述结构的模板。

结构声明定义类型。终止成员列表的右括号后可以跟变量列表。因此,就您而言:

....
} aCard, deck[52], *cardPtr;

aCarddeck[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 carddeck的类型为struct card[52],而cardPtr的类型为struct card *

答案 5 :(得分:0)

aCard和您提到的其他变量是类型struct card的变量,并且每个变量都包含char *facechar *suit。因此,某个变量如何能够包含自身,即aCard位于结构节点内部。