我有一个像这样的代码:
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;
我有几个问题:
- 如果我们可以用
- 代码末尾的
node_t
确实令人困惑,因为从我的理解它已经定义了一个类型node
,所以我们可以调用node x
来创建一个节点,那么node_t
的需要是什么,或者基本上在}
之后写任何东西,这意味着什么?
typedef struct { ... } node
来定义结构体,那么写typedef struct node {.....
又有什么用呢不应该这样做吗?
typedef struct {
int val;
struct node * next;
} node;
如果我们可以简单地用
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
name。之后,您可以使用标记或typedef
名称来声明您的结构变量。
struct node *new_node; // OK
node_t *head; // OK
实际上,标签和typedef名称甚至可以相同,尽管这不是必需的:
typedef struct node {
int val;
struct node * next;
} node;
不应该这样做吗?
typedef struct {
int val;
struct node * next;
} node;
。这行不通。为什么?
原因是,当一个结构有一个成员指向与node相同的结构时,我们需要使用结构标签。如果没有node
标记,我们将无法声明next
的类型。
建议阅读:作为Op要求良好的数据结构资源。
- 教程:介绍数据结构。
- 图书:经典数据结构。
第三块代码,您似乎对它有疑问,它有一个冗余标识符。
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];
通常,当我们定义一个结构时,之后引用它的唯一方法是定义了类型的名称(在第一个代码示例中,您只能通过node_t访问它),而稍微冗余的声明也允许通过"struct node"变量类型访问。
回答你的另一个问题,node_t
让你困惑的是你可以把结构体称为…例如
node_t node1;
struct node node2;
是节点结构的两个有效声明。
在这里,您也可以通过使用'struct p typedef p;'对'struct p'进行类型定义来使用'struct p'。当定义一个复杂的函数指针时,有时会让我感到困惑。我不知道为什么C语言支持这样的语法糖
我的解释如下。
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;
希望这解决了混乱。