2

我希望有人能告诉我我的理解是否正确。这是我的教授为我们的第一个任务提供的解决方案的一部分。

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 结构中定义了一个别名类型,这就像链表中的头指针。然后在最后我们定义alias_node,*alias_nodeptr,这是我们将用来遍历列表的指针,最后一行我很困惑,我希望有人能向我解释并纠正我,如果我误解了什么。

谢谢!

4

2 回答 2

2

之后 typedefstruct alias将等同于alias_node并且struct alias *将等同于alias_nodeptr. 您可以互换使用它们。您不能在结构本身中使用alias_nodeor alias_nodeptr,因为尚未评估将该结构绑定到新名称的 typedef。

这可能有点令人困惑,因为结构包含numvaluesand char *values[MAXARGS]。但它是一个有效的结构:一个节点的链表,每个节点都包含一个名称和一组多个 ( numvalues) 值。这里没有“列表头”结构,只有节点。您可以在不创建标题的情况下使用链接列表。您只需要记住指向列表中第一个节点的指针。

于 2013-06-26T22:16:08.840 回答
1

看来您对该typedef部分的理解略有不正确。您上面的代码片段正在做三件事:它声明并定义了一个名为 的类型struct alias,它用于typedefstruct aliasstruct alias *类型创建类型别名,它声明了一个名为 的变量alias_dictionary,其类型是那些typedefd 别名之一。

首先,你这样做:

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;

这是完全相同的事情,作为两个单独的步骤完成。

首先,我们声明 a struct alias,一个包含指向 char 的指针、一个 int、一个指向 char 的指针数组和一个指向结构的指针的复合类型。其次,我们定义了两个类型别名,alias_nodeand alias_nodeptr,这样声明alias_node foo;就等价于声明struct alias foo;,并且alias_nodeptr bar等价于声明struct alias * bar;

最后,第三。

alias_nodeptr alias_dictionary;

到目前为止,这应该是相当明显的。您正在声明一个名为 的变量alias_dictionary,它是一个指向struct alias.

于 2013-06-27T00:51:03.457 回答