我很难理解这个C结构中的typedef。
typedef struct node {
int value;
list rest;
} node;
typedef struct node *list;
“node”typedef声明和“list”声明之间有什么区别?为什么列表前面是指针? “节点”也不是指针吗?为什么我不能简单地说“typedef struct node list”并省略星号?我到处搜寻,我找不到满意的答案。
答案 0 :(得分:5)
第一个typedef
将node
定义为struct node
的别名,以便您可以简单地将其称为node
,而无需每次都写struct node
(在C“常规”类型名称和struct
名称存在于两个不同的名称空间中)。它相当于:
struct node
{
int value;
struct node* rest;
};
typedef struct node node;
第二个typedef
将list
定义为node *
的别名,即将类型list
定义为指针 node
结构。
(顺便说一句,我个人认为这是非常糟糕的风格:在typedef
内隐藏指针几乎总是一个坏主意;可以说可以识别指向列表中第一个元素的指针作为列表,但即使list
指针使用rest
也是恕我直言并不是很好)
答案 1 :(得分:1)
node
不是指针;它是struct
。 list
是指向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)
node
是struct
,其(令人困惑地)与struct node
的名称相同。 list
是指向struct node
的指针。所以以下是等价的:
struct node *a;
node *a;
list a;
答案 4 :(得分:0)
node
只是struct node
的同义词
list
是指向struct node
(或node
)的指针
每个节点实例都包含一个list
指针,使您可以构建数据结构,例如(单个)linked lists等。