请查看此代码块:
typedef struct node
{
int data;
struct node *next;
}
Node;
在这段代码中,Node
是typedef定义的struct node
的同义词,还是node
是struct的同义词?如果是后者,那么struct node *next;
等同于struct struct *next;
吗?
我是不是把事情搞得过于复杂了?
使用typedef
时,会创建某种类型的别名。
是的,Node
是struct node
的别名。
此外,您拥有的代码相当于
struct node
{
int data;
struct node *next;
};
typedef struct node Node;
typedef
不是结构定义的一部分,而是Node
定义的一部份。
Node
与struct node
同义。这就是为什么(例如)不使用
struct node* p;
可以使用
Node* p;
在C语法结构中,的定义方式如下
结构或联合说明符:
nbsp nbsp;结构或联合标识符opt{结构声明列表}
因此,要引用这个结构说明符,您需要使用它的名称。
您可以通过以下方式声明变量
struct node
{
int data;
struct node *next;
} Node;
这里CCD_ 13是类型为CCD_。struct node
又是变量Node
的类型说明符。
您可以省略结构说明符中的标识符。在这种情况下,该结构被称为未命名结构。然而,使用这样的结构,你不能在其定义中引用它本身。例如,您可能不写
struct
{
int data;
struct *next;
^^^^^^^^^^^^^
} Node;
因为不知道这里指的是什么结构。
您可以使用未命名的结构作为其他结构的成员。在这种情况下,这样的结构被命名为匿名结构,其成员成为封闭结构的成员。
例如
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
您不再需要到处写struct
。这不仅可以节省击键次数,还可以使代码更干净,因为它提供了更多的抽象。
之类的东西
typedef struct {
int x, y;
} Point;
Point point_new(int x, int y)
{
Point a;
a.x = x;
a.y = y;
return a;
}
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结构标签,则不需要每次都重复来定义新的结构变量即
typedef struct label Node;
现在Node可以用来定义新的类似类型的变量。