我有一个代码如下:
struct point {
int a;
int b;
}
可以像这样进一步使用:
struct point p;
p.x = 10;
p.y = 5;
现在我开始知道这也可以这样写:
typedef struct{
int x;
int y;
} point;
可以用作point p
当我开始学习链表时,混乱开始了,这就是我看到的代码。
typedef struct node {
int val;
struct node * next;
} node_t;
我有几个问题:
typedef struct { ... } node
来定义结构,那么使用写typedef struct node {.....
node_t
确实令人困惑,因为根据我的理解,它已经定义了类型node
,因此我们可以调用node x
来创建节点,然后是什么&# 39; node_t
是否需要或}
之后基本上写任何东西?不应该这样做吗?
typedef struct {
int val;
struct node * next;
} node;
答案 0 :(得分:7)
如果我们可以通过简单地使用
typedef struct { ... } node
来定义结构,那么使用写作typedef struct node {.....
- 醇>
代码末尾的
node_t
确实令人困惑,因为根据我的理解,它已经定义了类型node
,因此我们可以调用node x
来创建节点,那么node_t
的需要是什么,或者}
之后基本上是什么意思?
在C中,结构可以同时包含标记和typedef
名称。在结构声明中:
typedef struct node {
int val;
struct node * next;
} node_t;
node
是一个标记,node_t
是typedef
名称。之后,您可以使用标记或typedef
名称声明结构变量。
struct node *new_node; // OK
node_t *head; // OK
事实上,tag和typedef名称甚至可以相同,但不需要:
typedef struct node {
int val;
struct node * next;
} node;
不应该这样做吗?
typedef struct {
int val;
struct node * next;
} node;
没有。这不行。为什么呢?
原因在于,当结构具有指向与节点相同类型结构的成员时,我们需要使用结构标记。如果没有node
标记,我们将无法声明next
的类型。
建议阅读:由于Op正在寻求有关数据结构的良好资源。在这里你可以去:
答案 1 :(得分:4)
您似乎有疑问的第三个代码块具有冗余标识符。
typedef struct node {
int val;
struct node * next;
} node_t;
与
相同struct node{
int val;
struct node * next;
};
typedef struct node node_t;
它们是相同的,但合并到同一行。 typedef
周围的语法是
typedef [original name] [new name];
通常,当我们键入一个结构时,之后引用它的唯一方法是typedeffed名称(在第一个代码示例中,你只能通过node_t访问它),而稍微多余的声明允许通过“ struct node“也是变量类型。
要回答您的另一个问题,您感到困惑的node_t
就是您可以将结构称为...例如
node_t node1;
struct node node2;
节点结构的两个有效声明。
答案 2 :(得分:0)
在这里,你也可以使用'struct p',使用'struct p typedef P;'来定义它。当typedef是一个复杂的函数指针时,它有时会让我感到困惑。 我不知道为什么C std。支持这样的语法糖。
答案 3 :(得分:0)
这是我的解释。
struct
{
int i;
};
声明一个未命名的结构,显然没有真正的用法。如果我错了,请纠正我。
struct
{
int i;
} T;
现在T是给定范围内的对象,类型是未命名的。
struct TT
{
int i;
} T;
声明结构TT和对象T.您可以使用TT创建更多对象。考虑这个问题的最佳方法是,将struct TT {int i}视为单一类型,例如double。
typedef struct TT
{
int i;
};
具有相同的含义(至少在现今的编译器中。我不确定旧版本)
struct TT
{
int i;
};
和
typedef struct
{
int i;
} TT;
声明给定结构的类型TT(不是对象),因为您使用的是typedef int Int;
希望这能解决这个烂摊子。