我希望有人能告诉我,如果我的理解是正确的。这是我教授给我们第一次任务的解决方案的一部分。
typedef struct alias{
char *name;
int numvalues;
char *values[MAXARGS];
struct alias *next;
} alias_node, *alias_nodeptr;
alias_nodeptr alias_dictionary;
所以我们定义了一个结构别名,名称,numvalues和values对我来说都很熟悉,但定义为“struct alias * next;”我们在别名结构中定义了一个别名类型,这就像链表中的头指针一样。然后在最后我们定义了alias_node,* alias_nodeptr,这是我们将用于遍历列表的指针,最后一行我很困惑,我希望有人可以向我解释并纠正我,如果我误解了什么。
谢谢!
答案 0 :(得分:2)
之后,typedef struct alias
将与alias_node
等效,struct alias *
将与alias_nodeptr
等效。您可以互换使用它们。您不能在结构本身内部使用alias_node
或alias_nodeptr
,因为尚未评估将该结构绑定到新名称的typedef。
这可能有点令人困惑,因为该结构包含numvalues
和char *values[MAXARGS]
。它是一个有效的结构:节点的链接列表,每个节点包含一个名称和一组多个(numvalues
)值。这里没有“列表标题”结构,只有节点。您可以使用链接列表而无需创建标题。您只需要记住指向列表中第一个节点的指针。
答案 1 :(得分:1)
您对typedef
部分的理解似乎有点不正确。上面的代码片段做了三件事:它声明并定义了一个名为struct alias
的类型,它使用typedef
为struct alias
和struct alias *
类型创建类型别名,它声明一个名为alias_dictionary
的变量,其类型是typedef
个别名之一。
首先,你这样做:
typedef struct alias{
char *name;
int numvalues;
char *values[MAAXARGS];
struct alias *next;
} alias_node, *alias_nodeptr;
现在,这是一次做两件事,所以我会更简单地重申:
struct alias {
char *name;
int numvalues;
char *values[30];
struct alias *next;
};
typedef struct alias alias_node, *alias_nodeptr;
这是完全相同的事情,只需两个步骤即可完成。
首先,我们声明一个struct alias
,一个包含指向char的指针的复合类型,一个int,一个指向char的指针数组和一个指向结构的指针。
其次,我们定义了两个类型别名alias_node
和alias_nodeptr
,因此声明alias_node foo;
等同于声明struct alias foo;
,而alias_nodeptr bar
等同于声明{{} 1}}。
最后,第三。
struct alias * bar;
到目前为止,这应该是相当明显的。您正在声明一个名为alias_nodeptr alias_dictionary;
的变量,它是指向alias_dictionary
的指针。