C中的typedef混淆

时间:2011-12-20 22:27:13

标签: c struct typedef

我很难理解这个C结构中的typedef。

typedef struct node {
   int   value;
   list  rest;
} node;

typedef struct node *list;

“node”typedef声明和“list”声明之间有什么区别?为什么列表前面是指针? “节点”也不是指针吗?为什么我不能简单地说“typedef struct node list”并省略星号?我到处搜寻,我找不到满意的答案。

5 个答案:

答案 0 :(得分:5)

第一个typedefnode定义为struct node的别名,以便您可以简单地将其称为node,而无需每次都写struct node(在C“常规”类型名称和struct名称存在于两个不同的名称空间中)。它相当于:

struct node
{
    int value;
    struct node* rest;
};

typedef struct node     node;

第二个typedeflist定义为node *的别名,即将类型list定义为指针 node结构。

(顺便说一句,我个人认为这是非常糟糕的风格:在typedef内隐藏指针几乎总是一个坏主意;可以说可以识别指向列表中第一个元素的指针作为列表,但即使list指针使用rest也是恕我直言并不是很好)

答案 1 :(得分:1)

node不是指针;它是structlist是指向node的指针的typedef。

您在{C}中typedef struct以避免在任何地方输入struct node ...

这是否是好的做法是值得怀疑的(大多数人会同意将指针类型隐藏在typedef后面,除非它真的是不透明的,这是一个坏主意),但这是它的要点。

答案 2 :(得分:1)

第一个声明说node是结构。第二个说list是指向节点的指针。

所以,这将是使用这些声明的正确代码:

list  x;
node  n;

x = &n;

使用typedef struct node list声明项目不正确。 typedef语句声明了一种新类型。关键字typedef不属于该类型的名称。

答案 3 :(得分:1)

nodestruct,其(令人困惑地)与struct node的名称相同。 list是指向struct node的指针。所以以下是等价的:

struct node *a;
node *a;
list a;

答案 4 :(得分:0)

node只是struct node同义词

list是指向struct node(或node)的指针

每个节点实例都包含一个list指针,使您可以构建数据结构,例如(单个)linked lists等。