【发布时间】:2016-01-16 06:36:52
【问题描述】:
我是 C 编程的初学者,我正在学习链接列表。 我正在尝试创建一个链接列表,它将以正确的顺序显示字母。该程序使用户能够按字母顺序在列表中插入一个字符或从列表中删除一个字符。 所以,我举了一个例子,但有一些我无法理解。
这是代码的第一部分:
#include <stdio.h>
#include <stdlib.h>
struct listNode {
char data;
struct listNode *nextPtr;
};
typedef struct listNode ListNode;
typedef ListNode *ListNodePtr;
在那部分之后,程序从函数原型开始。
我知道底部第二行中typedef 的用法。
但我不知道的是,代码的最后一行包含:
typedef ListNode *ListNodePtr;
这是什么意思?
【问题讨论】:
-
请参阅Is it a good idea to
typedefpointers? 以获得关于最后一行无益的强烈建议。至少在您的情况下,它清楚地包含名称中的Ptr,但*也与Ptr一样清晰。 -
我总是想知道对于带有
Ptr或类似名称的类型名的后缀/前缀有什么好处,而不是仅仅将*放在类型名的前面。后者更加明确,并且对命名空间的污染更少,如果你因此会使用它(如果不是,它有什么好处呢?)。 -
@Olaf 我猜我们几天前也进行了类似的讨论,并且有 一个 可能很好地使用
typedef指针,即客户端代码获取它作为一个不透明的句柄,真的不应该知道它是一个指针。 (例如,因为它可以在以后的版本中更改为int而不会在 API 中引入重大更改)当然,这是一个极端情况,当然您不会使用 @987654334 @后缀然后... -
@FelixPalmen:History repeating。它每隔几周就会出现在这里。但我实际上也反对这样的指示。注意这里不包括 opaque/
typedefedstructs ,非常有用。 -
@Olaf 很喜欢这首歌,很久以前...我仍然不严格反对,在某些情况下您需要 不透明的句柄 并使其成为指针可能是一个实现细节。但在一般情况下,
typedefing 指针确实是一个禁忌 :)