关于C语言中typedef struct Node *pNode定义的两处疑问
typedef struct Node *pNode的两个疑问解答 先把你贴的代码放出来方便对照:
typedef int T; typedef struct Node *pNode; typedef struct Node{ T item; pNode next; }Node;
疑问1:为何要定义typedef struct Node *pNode这种形式?
说白了,这就是用typedef给指针类型起一个简洁的别名,核心目的是简化代码、提升可读性,尤其是在链表这种需要频繁使用结构体指针的场景里。
在C语言中,如果你不做这个typedef,每次声明指向Node结构体的指针时,都得写struct Node* xxx;——要知道struct关键字是不能省略的(除非你给结构体本身也起了typedef别名,比如代码最后一行的typedef struct Node Node,这样之后可以直接用Node代替struct Node)。而有了pNode这个别名后,你只需要写pNode xxx;就等价于struct Node* xxx;,写起来更顺手,代码也更清爽。
另外还有一个隐藏的好处:如果以后需要调整这个指针指向的类型(虽然这个场景里大概率不会,但换个复杂点的项目就有可能),你只需要修改typedef那一行,不用挨个去改所有的指针声明,维护起来更方便。
疑问2:为何pNode next;不用标注为指针类型?
这是因为**pNode本身就是指针类型的别名**!
再仔细看typedef struct Node *pNode;这句话:它的意思是把struct Node*这个「指向Node结构体的指针类型」,直接命名为pNode。所以当你写pNode next;时,就完全等价于struct Node* next;——next已经是一个指针了,根本不需要再加*。
要是你画蛇添足写成pNode* next;,那它就变成struct Node** next;,也就是「指向指针的指针」了,这可不是链表节点里用来指向下一个节点的next指针该有的类型哦。
内容的提问来源于stack exchange,提问作者s1m0n

