C typedef结构如何在语法上工作?

C typedef结构如何在语法上工作?,c,typedef,C,Typedef,我是新来的,所以我很抱歉,如果我太笨了。我无法理解如何使用typedef。假设我有以下命令: typedef struct { char pseudo[MAX_SIZE] ; int nb_mar ; } player ; 这将创建一个名为player的类型,它由一系列字符和一个int组成,对吗 现在,如果我们有这行代码: struct set_of_players { player T[NB_MAX_JOUEURS] ; int nb ; };

我是新来的,所以我很抱歉,如果我太笨了。我无法理解如何使用
typedef
。假设我有以下命令:

typedef struct {
    char pseudo[MAX_SIZE] ;
    int nb_mar ;
    } player ;
这将创建一个名为
player
的类型,它由一系列字符和一个
int
组成,对吗

现在,如果我们有这行代码:

struct set_of_players {
    player T[NB_MAX_JOUEURS] ;
    int nb ;
    }; 
我不明白这是怎么回事?我假设它创建了一个struct
set\u of_players
类型的变量,但它叫什么?通常,当我看到这种命令时,在闭包后面有一个单词,代表变量名,但在这里它什么都没有;我不明白。如果我没有为
set\u播放器
typedef结构
,这还能用吗

最后,我有一行我不理解的代码:

typedef struct set_of_players players;
老实说,我甚至不知道这意味着什么。我假设这是我需要的
typedef
,以使前面的命令有意义,但我甚至不知道它做什么

再一次,我很抱歉,如果我看这个错误的方式,并为糟糕的格式。任何帮助都将不胜感激,谢谢。

第一句语法 这定义了一个未命名的
结构。然后,使用
typedef
,它为这个
struct
player
创建一个别名

然后,您可以这样声明您的
struct

player my_player;
player my_player;
struct s_player my_player;
struct set_of_players my_set;
players my_set_var;
它与以下语法类似:

typedef struct s_player {
  char pseudo[MAX_SIZE];
  int nb_mar;
} player;
在第二种情况下,由于您的
struct
有一个名称,您可以像这样声明一个
player

player my_player;
player my_player;
struct s_player my_player;
struct set_of_players my_set;
players my_set_var;

第二语法 这定义了一个结构
struct set\u播放器
,因为您没有
typedef
,所以您需要像下面这样声明此类型的变量:

player my_player;
player my_player;
struct s_player my_player;
struct set_of_players my_set;
players my_set_var;

第三语法 这定义了一个类型
players
,它是players的类型
struct set\u的别名

因为这会为玩家的
struct set\u创建一个别名,所以它使用第二种语法:

struct set_of_players {
  player T[NB_MAX_JOUEURS];
  int nb;
};

typedef
语句允许您为给定类型创建别名。然后可以使用别名或原始类型名来声明该类型的变量

typedef int number;
struct set_of_players {
    player T[NB_MAX_JOUEURS] ;
    int nb ;
}; 
这将为
int
创建一个名为
number
的别名。因此,以下两条语句声明了相同类型的变量:

int num1;
number num2;
现在使用您的示例:

typedef struct {
    char pseudo[MAX_SIZE] ;
    int nb_mar ;
} player ;
这将创建一个匿名结构,并为其提供别名
player
。由于结构没有名称,因此只能使用别名创建该类型的变量

typedef int number;
struct set_of_players {
    player T[NB_MAX_JOUEURS] ;
    int nb ;
}; 
这将创建一个名为
struct set\u of_players
的结构,但不声明typedef,也不声明该类型的变量。还要注意,其中一个字段是一个类型为
player
的数组,这是我们前面定义的。以后可以按如下方式声明此类型的变量:

struct set_of_players my_set_var;
这一行:

typedef struct set_of_players players;
为名为
players
struct set\u播放器创建别名。在这种情况下,结构不是与typedef同时定义的,而是在别处定义的。现在您可以像这样声明这种类型的变量:

player my_player;
player my_player;
struct s_player my_player;
struct set_of_players my_set;
players my_set_var;

这与使用完整结构名称的版本相同。

在您声明了这行代码之后,我将回答您

因此,您的代码的工作方式如下:-

假设:-

 #define MAX_SIZE 20
 #define NB_MAX_JOUEURS 2
现在,您可以在我们的代码中使用以下两种类型名称:-

 typedef struct set_of_players players;
 players PLAYERS;
 strcpy(PLAYERS.T[0].pseudo, "something");
 PLAYERS.T[0].nb_mar = 1;

 struct set_of_players {
      player T[NB_MAX_JOUEURS] ;// reffering to the above example you have created a array of struct `player` and its size is 2
   int nb ;
  };
您也可以使用上面的结构,如下所示:-

 struct set_of_players setplayers;
 strcpy(setplayers.T[0].pseudo, "something");
 setplayers.T[0].nb_mar = 1;

向其声明类型名称时,不需要使用
struct set\u of\u players
创建变量,而是使用类型名称。这意味着您已经为您的结构指定了一个特定的名称,在您的情况下,它分别是player和players

typedef
是一件非常简单的事情。尽管名称不同,它并不定义新类型,而是为现有类型定义别名(名称)。其语法在所有情况下都是:

typedef <existing-type> <type-alias>

事实上,只有在结构是自引用的情况下,才需要标记名,即它包含指向其自身类型的结构的指针(例如在链表中),然后:

typedef结构
{
struct*self;//不能在此处使用;
//它还不存在。
...
}  ;

typedef
struct
是两种不同类型的声明<代码>结构定义结构类型
typedef
为现有类型定义别名(它不会创建新类型)。它们可以组合成一个声明。两者都不创建指定类型的对象(变量)

struct player {
    char pseudo[MAX_SIZE];
    int nb_mar;
};
这是一个结构定义。它创建了一个名为
struct player
的新类型

typedef struct {
    char pseudo[MAX_SIZE];
    int nb_mar;
} player;
结构定义中的标记是可选的。如果省略它,则结构类型为匿名。这里我们将匿名结构定义与typedef相结合,使
player
成为匿名结构类型的别名

typedef struct player {
    char pseudo[MAX_SIZE];
    int nb_mar;
} player;
这里我们创建一个名为
struct player
的结构类型和该类型的别名
player
。(结构定义的语法将标记放在
struct
关键字之后;typedef的语法将名称放在末尾。)

我们现在可以将该类型称为
struct player
player

下面是做同样事情的另一种方法:

struct player {
    char pseudo[MAX_SIZE];
    int nb_mar;
};
typedef struct player player;
通过两个单独的声明,我们创建了一个名为
struct player
的新类型,然后使用typedef为该类型定义一个新名称
player

typedef struct {
    char pseudo[MAX_SIZE];
    int nb_mar;
} player;
在所有这些示例中,我对结构标记和typedef名称使用了相同的标识符。没有要求它们相同,并且有一些编码约定,您可以使用
struct player_s
typedef。。。播放器\u t
。但由于两个名称都引用相同的类型,因此没有真正的理由使用不同的名称。他们至少应该是b