3

我已经获得了构成我的堆栈的节点的结构,但我无法理解它。

    struct stackNode 
{
  char data;
  struct stackNode *nextPtr;
};

typedef struct stackNode StackNode; 
typedef StackNode *StackNodePtr;

我知道我有一个名为 stackNode 的结构,重命名为 StackNode(或第二种类型,除了名称之外的所有内容都相同?),它有两种类型,一个字符和一个指向 stackNode 的指针。

我不确定最后一行是什么意思,有人可以通过它向我解释吗?我认为这意味着有一个新类型,它是一个指向 StackNode 的指针,称为 StackNodePtr。这是正确的吗?

4

2 回答 2

4

是的,每当您使用 a 时,StackNodePtr您本质StackNode*上都是在使用 a ,而后者又等于 a struct stackNode*。间距和星号位置显然会导致一些混乱。我个人会写它,typedef StackNode* StackNodePtr;以便更清楚地了解什么是 typedef 到什么。

这三行将是相等的:

StackNodePtr myPointer;
StackNode *myPointer; 
struct stackNode *myPointer;

的原因typedef struct stackNode StackNode通常是为了避免struct在使用时必须编写。

于 2013-05-09T01:14:41.250 回答
2

你有三样东西。

  1. 您正在声明一个名为 的类型struct stackNode,并提供结构定义。
  2. 您正在定义一个新类型 ,StackNode它是(并且类型兼容)的别名struct stackNode
  3. 您正在定义一个新类型 ,StackNodePtr它是(并且再次与类型兼容)StackNode *(和struct stackNode *)的别名。

问题在于,不是将节点变量声明为struct stackNode newNode,将列表头struct stackNode *head声明为 ,而是将节点变量声明为 ,列表头声明StackNode newNodeStackNodePtr head

这是一个相当普遍的习语,尽管有些人建议不要这样做。(当然,其他人也坚持认为这也是正确的方法。)

于 2013-05-09T01:24:58.917 回答