什么是typedef struct node {...} Node;代表?

时间:2015-11-30 09:25:10

标签: c linked-list

请查看以下代码区块:

typedef struct node
{
    int data;
    struct node *next;
} 
Node;

在此代码中,Nodestruct node的同义词,由typedef定义,还是node与struct同义?如果是后者,则struct node *next;相当于struct struct *next;

我是不是太复杂了?

5 个答案:

答案 0 :(得分:11)

使用typedef时,您可以创建某种类型的别名

是的,Nodestruct node的别名。

此外,您拥有的代码相当于

struct node
{
    int data;
    struct node *next;
};
typedef struct node Node;

typedef不是结构定义的一部分,它是Node定义的一部分。

答案 1 :(得分:4)

Nodestruct node同义。这就是为什么(对于你的例子)而不是使用

struct node* p;

可以使用

Node* p;

答案 2 :(得分:2)

在C语法中,结构的定义方式如下

结构 - 或联合说明符:
struct-or-union标识符 opt {struct-declaration-list}

因此,要引用此结构说明符,您需要使用其名称。

您可以通过以下方式声明变量

struct node
{
    int data;
    struct node *next;
} Node;

此处Nodestruct node类型的对象。反过来struct node是变量Node的类型说明符。

您可以省略结构说明符中的标识符。在这种情况下,该结构称为未命名结构。但是,使用这样的结构,您无法在其定义中引用它本身。例如,您可能不会写

struct 
{
    int data;
    struct *next;
    ^^^^^^^^^^^^^
} Node;

因为不知道这里引用了什么结构。

您可以使用未命名的结构作为其他结构的成员。在这种情况下,这样的结构被命名为 anonymous 结构,其成员成为封闭结构的成员。

例如

struct A
{
   struct
   {
       int x;
       int y;
   ];
   int z;
};

此结构A有三个成员xyz

当使用存储类说明符时,声明符是一个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可用于定义新的相似类型的变量。