【问题标题】:What exactly does typedef struct node {...} Node; represent?typedef struct node {...} Node; 到底是什么?代表?
【发布时间】:2016-03-03 21:17:11
【问题描述】:

请查看此代码块:

typedef struct node
{
    int data;
    struct node *next;
} 
Node;

在这段代码中,Node 是 typedef 定义的 struct node 的同义词,还是 node 是 struct 的同义词?如果是后者,那么struct node *next;是否等同于struct struct *next;?

我是不是把事情复杂化了?

【问题讨论】:

  • 您的结构是通常称为“链表”的结构的一部分。如果您想知道如何使用它以及为什么写struct node *next,请搜索它。至于您的问题,在您的代码中使用struct node { ... };,您必须将变量声明为struct node mynode1;。使用typedef struct node Node; 你只需要写Node mynode1
  • 我认为它会产生错误...Node* hashtable[SIZE],另一方面,会生成一个包含 SIZE 元素的数组;它们中的每一个都是一个指向结构节点的指针(因此,由于每个结构都可以被认为是列表的头,它是一个 SIZE 列表的数组,或者它可以是一个包含指向同一列表的各个元素的指针的数组,它取决于你如何使用它)
  • @frarugi87 为什么int x; 声明一个指向名为 x 的 int 没有指针,而 Node* hashtable[SIZE]; 声明一个指向 Node 的 SIZE 指针数组(Node 是指针) ?
  • 不,int x; 没有声明指向 int 的指针。它声明并定义了一个 int。 int* x; 声明一个指向 int 的指针,与 Node* onenode 相同。然后,就像int arr[2] 声明一个包含两个 int 的数组,int* arr[2] 声明一个包含两个指向 int 的指针的数组,Node* arr[2] 声明一个包含两个指向 struct node 的指针的数组,又名 Node

标签: c struct linked-list declaration


【解决方案1】:

当您使用typedef 时,您会创建某种类型的别名。

所以是的,Node 是 struct node 的别名。


另外,你拥有的代码相当于

struct node
{
    int data;
    struct node *next;
};
typedef struct node Node;

typedef 不是结构定义的一部分,它是Node 定义的一部分。

【讨论】:

  • 感谢您的回答!此外,是否 node* hashtable[SIZE];声明一个指向某个大小的名为 hashtable 的数组的结构指针?
  • @PurpleYoshiiii 如果你的意思是Node* hashtable[SIZE];(注意Node 中的大写N),那么这是一个SIZE 指向Node 的指针数组的声明。在这种特定情况下,基本上是一个列表数组。
  • 那么,Node* hashtable[SIZE]; 声明了一个指向Node 的 SIZE 指针数组?如果是这样,那为什么int* x; 只声明一个名为 x 的 int 指针而没有指针,而 Node* hashtable[SIZE]; 声明一个指向 Node 的 SIZE 指针数组(Node 是指针)。
  • 为什么int* x; 只声明一个名为 x 的 int 指针而没有指针,而 Node* hashtable[SIZE]; 声明一个指向 Node 的 SIZE 指针数组(Node 是指针)?
  • @PurpleYoshiii 我不确定我明白你的意思吗?在您的示例中,x 只是一个指向 int 的未初始化指针(您可以指向单个整数或数组(编译时或动态分配)。变量 hashtable 是指向 @ 的同样未初始化的指针数组987654344@。这就像问Node *a_pointer 和Node *array_of_pointers[SIZE] 有什么不同,它们只是两个不同的声明,声明了两个不同类型的两个不同变量。
【解决方案2】:

Node 是 struct node 的同义词。这就是为什么(对于你的例子)而不是使用

struct node* p;

可以使用

Node* p;

【讨论】:

    【解决方案3】:

    在C语法结构中定义如下方式

    结构或联合说明符:
    结构或联合标识符opt { struct-declaration-list }

    所以要引用这个结构说明符,你需要使用它的名字。

    您可以通过以下方式声明变量

    struct node
    {
        int data;
        struct node *next;
    } Node;
    

    这里Node 是struct node 类型的对象。而struct node 是变量Node 的类型说明符。

    您可以省略结构说明符中的标识符。在这种情况下,该结构称为 unnamed 结构。但是,使用这样的结构,您不能在其定义中引用它本身。比如你可能不会写

    struct 
    {
        int data;
        struct *next;
        ^^^^^^^^^^^^^
    } Node;
    

    因为不知道这里指的是什么结构。

    您可以将未命名的结构用作其他结构的成员。在这种情况下,这样的结构被命名为 anonymous 结构,它的成员成为封闭结构的成员。

    例如

    struct A
    {
       struct
       {
           int x;
           int y;
       ];
       int z;
    };
    

    这个结构A 有三个成员x、y 和z。

    当使用存储类说明符时,声明符是一个标识符,它是一个 typedef 名称,表示为标识符指定的类型。

    因此在此声明中

    typedef struct node
    {
        int data;
        struct node *next;
    } Node;
    

    Node 还不是一个对象。它是一个类型名称,表示结构节点。

    所以从现在开始你可以使用类型名称Node而不是类型说明符struct node

    【讨论】:

      【解决方案4】:

      您不再需要到处写struct。这不仅节省了击键次数,还可以使代码更简洁,因为它提供了更多的抽象。

      类似的东西

      typedef struct {
        int x, y;
      } Point;
      
      Point point_new(int x, int y)
      {
        Point a;
        a.x = x;
        a.y = y;
        return a;
      }
      

      【讨论】:

        【解决方案5】:
        typedef struct node
        {
            int data;
            struct node *next;
        } 
        Node;
        

        这个可以简单理解

        struct node 
        {
            int data;
            struct node *next;
        };
        
            typedef  struct node Node;
        

        struct [structure tag or label] {
        
           member definition;
           ...
           member definition;
        } [one or more structure variables];  
        

        新变量可以定义为:

        struct label <variable>;
        

        或者如果你使用typedef struct label 不需要每次都重复定义新的结构变量 即

        typedef struct label Node;
        

        现在节点可以用来定义新的类似类型的变量。

        【讨论】:

        • 其实是typedef struct node Node;,而不仅仅是node
        • 谢谢,我忘记了 :-)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-22
        • 1970-01-01
        • 2015-06-16
        • 1970-01-01
        相关资源
        最近更新 更多