Typedef Struct Understanding

时间:2013-06-26 22:10:09

标签: c struct alias

我希望有人能告诉我,如果我的理解是正确的。这是我教授给我们第一次任务的解决方案的一部分。

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,这是我们将用于遍历列表的指针,最后一行我很困惑,我希望有人可以向我解释并纠正我,如果我误解了什么。

谢谢!

2 个答案:

答案 0 :(得分:2)

之后,typedef struct alias将与alias_node等效,struct alias *将与alias_nodeptr等效。您可以互换使用它们。您不能在结构本身内部使用alias_nodealias_nodeptr,因为尚未评估将该结构绑定到新名称的typedef。

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

答案 1 :(得分:1)

您对typedef部分的理解似乎有点不正确。上面的代码片段做了三件事:它声明并定义了一个名为struct alias的类型,它使用typedefstruct aliasstruct 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_nodealias_nodeptr,因此声明alias_node foo;等同于声明struct alias foo;,而alias_nodeptr bar等同于声明{{} 1}}。

最后,第三。

struct alias * bar;

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