请查看以下代码区块:
typedef struct node
{
int data;
struct node *next;
}
Node;
在此代码中,Node
是struct node
的同义词,由typedef定义,还是node
与struct同义?如果是后者,则struct node *next;
相当于struct struct *next;
?
我是不是太复杂了?
答案 0 :(得分:11)
使用typedef
时,您可以创建某种类型的别名。
是的,Node
是struct node
的别名。
此外,您拥有的代码相当于
struct node
{
int data;
struct node *next;
};
typedef struct node Node;
typedef
不是结构定义的一部分,它是Node
定义的一部分。
答案 1 :(得分:4)
Node
与struct node
同义。这就是为什么(对于你的例子)而不是使用
struct node* p;
可以使用
Node* p;
答案 2 :(得分:2)
在C语法中,结构的定义方式如下
结构 - 或联合说明符:
struct-or-union标识符 opt {struct-declaration-list}
因此,要引用此结构说明符,您需要使用其名称。
您可以通过以下方式声明变量
struct node
{
int data;
struct node *next;
} Node;
此处Node
是struct node
类型的对象。反过来struct node
是变量Node
的类型说明符。
您可以省略结构说明符中的标识符。在这种情况下,该结构称为未命名结构。但是,使用这样的结构,您无法在其定义中引用它本身。例如,您可能不会写
struct
{
int data;
struct *next;
^^^^^^^^^^^^^
} Node;
因为不知道这里引用了什么结构。
您可以使用未命名的结构作为其他结构的成员。在这种情况下,这样的结构被命名为 anonymous 结构,其成员成为封闭结构的成员。
例如
struct A
{
struct
{
int x;
int y;
];
int z;
};
此结构A
有三个成员x
,y
和z
。
当使用存储类说明符时,声明符是一个typedef名称的标识符,表示为标识符指定的类型。
因此在此声明中
typedef struct node
{
int data;
struct node *next;
} Node;
Node
尚未成为对象。它是一个表示结构节点的类型名称。
因此,从现在开始,您可以使用类型名称Node
而不是类型说明符struct node
答案 3 :(得分:1)
你不再需要在整个地方写struct
。这不仅可以节省击键次数,还可以使代码更清晰,因为它提供了更多的抽象。
像
一样typedef struct {
int x, y;
} Point;
Point point_new(int x, int y)
{
Point a;
a.x = x;
a.y = y;
return a;
}
答案 4 :(得分:1)
typedef struct node
{
int data;
struct node *next;
}
Node;
这可以简单地通过
来理解struct node
{
int data;
struct node *next;
};
typedef struct node Node;
struct [structure tag or label] {
member definition;
...
member definition;
} [one or more structure variables];
新变量可以定义为:
struct label <variable>;
或者如果你使用typedef struct label,每次都不需要重复定义新的结构变量 即
typedef struct label Node;
现在,Node可用于定义新的相似类型的变量。