这些c struct声明之间的区别?

时间:2014-06-24 12:40:23

标签: c struct linked-list

我有一个代码如下:

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;

我有几个问题:

  1. 如果我们可以通过简单地使用typedef struct { ... } node来定义结构,那么使用写typedef struct node {.....
  2. 代码末尾的node_t确实令人困惑,因为根据我的理解,它已经定义了类型node,因此我们可以调用node x来创建节点,然后是什么&# 39; node_t是否需要或}之后基本上写任何东西?
  3. 不应该这样做吗?

    typedef struct {
            int val;
            struct node * next;
        } node;
    

4 个答案:

答案 0 :(得分:7)

  
      
  1. 如果我们可以通过简单地使用typedef struct { ... } node来定义结构,那么使用写作typedef struct node {.....

  2.   
  3. 代码末尾的node_t确实令人困惑,因为根据我的理解,它已经定义了类型node,因此我们可以调用node x来创建节点,那么node_t的需要是什么,或者}之后基本上是什么意思?

  4.   

在C中,结构可以同时包含标记和typedef名称。在结构声明中:

typedef struct node {
    int val;
    struct node * next;
} node_t;   

node是一个标记,node_ttypedef名称。之后,您可以使用标记或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. 教程:Introduction to Data Structures
  2. 书:Classic Data Structures

答案 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;

希望这能解决这个烂摊子。