我认为你对做什么感到困惑typedef
。
像这样的声明:
struct node { ... };
将定义一个名为struct node
. 不要忘记这个词struct
!如果你说只是node
它没有任何意义(请注意,这在 C++ 中是不同的)。
因此,现在要创建一个局部变量,您可以:
struct node x;
并做一个动态的:
struct node *px = malloc(sizeof(struct node));
现在,如果您想为该类型创建别名,则使用与创建变量相同的语法,但您typedef
在声明的开头编写:
typedef struct node Node;
或者,如果您更喜欢指针类型:
typedef struct node *PNode;
然后创建变量:
Node a;
Node *b = malloc(sizeof(Node));
PNode c = malloc(sizeof(Node)); //do not use sizeof(PNode) as it is useless here
正如@WhozCraig 在评论中所说,有些人似乎打算在原始代码中更喜欢使用声明变量sizeof
而不是类型:
Node *b = malloc(sizeof(*b));
PNode c = malloc(sizeof(*c));
其实除了款式没什么区别,还是选你喜欢的吧!
请注意,在定义原始结构时,您可以使用相同的声明来创建变量或 typedef,但不能同时使用两者:
struct node { ... } a; //a is a variable
typedef struct node {...} b; //b is a type
有些人喜欢强制使用语法并执行以下操作:
typedef struct node {...} Node, *PNode; //tree types in one line!
但我个人觉得这种做法有点愚蠢:除非你想隐藏它是指针的事实,否则不要 typedef 指针。