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 ;
};
我不明白这是怎么回事?我假设它创建了一个structset\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