无法理解结构(C)中的“ typedef”和指针用法

时间:2019-05-15 12:54:51

标签: pointers data-structures struct linked-list typedef

我的问题与CI中学习列表的早期阶段有关,无论是否与最简单的代码有关,我都无法在任何地方找到对我的问题的明确答案。(会给你一个例子,说明我在一个非常简单的代码上并没有清楚地了解到什么,只是为了让你失去我的理解。这是我遇到的更复杂的问题。

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

我得到了什么数据,next用作变量,但我没有得到: struct node * next的真正含义。我们是否创建一个名为next的新结构,它具有新数据和next成员?我还没得到的是下一个*的用法。

**下面是一个旨在创建选项卡并向这些选项卡添加站点地址的代码。浏览者会做什么。参考性代码中的InfoSession。我正在创建的列表是一个双向链接列表。**但是我不明白两件事: 1)例如,TabNodePtr LastTab到底是什么意思?LastTab是现在具有以上所有功能的新结构:

TabNodePtr PrevTab, NextTab;
SiteNodePtr FirstSite;
SiteNodePtr CurrSite;

作为成员?与SiteNodePtr相同。我不知道他们是如何联系在一起的,这对我来说简直就是圣诞花环。 2)为什么我们要为成员使用指针?并且不仅仅使用TabNode LastTab吗?指针在哪里产生差异,必须添加它们?

   typedef struct TabNode *TabNodePtr;
    typedef struct SiteNode *SiteNodePtr;

    struct InfoSession {
        TabNodePtr FirstTab;
        TabNodePtr LastTab;
        TabNodePtr CurrTab;
    };

    struct TabNode {    
        TabNodePtr PrevTab, NextTab;
        SiteNodePtr FirstSite;
        SiteNodePtr CurrSite;
    };

    struct SiteNode{
        SiteNodePtr PrevSite, NextSite;
        TabNodePtr UpTab;
    };

1 个答案:

答案 0 :(得分:1)

您还有很长的路要走。...

如果可以在您学习C语言的过程中有所帮助,请让我尝试一下。

  

struct node *next的真正含义。我们是否创建一个名为next的新结构,该结构具有新数据和next成员?我还没有得到* next中的用法。

struct node *next;

此语句声明一个名为next的变量,其类型为struct node *,这意味着next是一个指针,可以指向类型为struct node的地址。
例如在语句int *p;中,变量p的类型为int *,这意味着p是可以指向int的指针。 [有关指针,请查看thisthis或在Google上搜索或参考任何好书]

您是否听说过C语言中的自我引用结构
自引用结构是一种结构,其中其成员之一是指向该结构本身的指针。

因此,在此结构声明中:

       -------------------------------------------------
       |                                               |
       v                                               |
  struct node{                                     -----------
      int data;                                    |         |
      struct node *next;   // next is a pointer to struct node, i.e. pointer to self
  };

struct node是一个自引用结构。 [有关自引用结构检查this及其用法的检查this的更多详细信息。]

  

但是我不明白两件事:1)TabNodePtr LastTab到底是什么意思?LastTab是一个具有以上所有内容的新结构吗?...

首先,通读C语言中的指针(更具体地讲,指向结构的指针)。

typedef用于为其他数据类型创建别名。 [阅读有关typedef here和有关typedef结构here的更多信息,或参阅任何好书。]

所以,当你写

typedef struct TabNode *TabNodePtr;

这意味着,TabNodePtr现在是struct TabNode *类型的别名,您可以使用TabNodePtr来声明类型struct TabNode *的变量。

因此,在上面的typedef....语句之后,当您编写

TabNodePtr xyz;

与此完全相同

struct TabNode *xyz;

在您的代码中:

TabNodePtr LastTab;

这声明了类型为LastTab的变量struct TabNode *,这意味着LastTab是指向struct TabNode的指针。

所以,这是

    struct InfoSession {
        TabNodePtr FirstTab;
        TabNodePtr LastTab;
        TabNodePtr CurrTab;
    };

与此完全相同

    struct InfoSession {
        struct TabNode *FirstTab;
        struct TabNode *LastTab;
        struct TabNode *CurrTab;
    };

SiteNodePtr也是如此,这也是struct SiteNode *的别名。

  

2)为什么我们要为成员使用指针?例如,不只是与TabNode LastTab一起使用?指针在哪里引起差异,必须添加它们?

Why do we use pointers for the members? Why do we use pointers? -对于不了解或很少了解C和C指针的人来说,这是一个很自然的问题对于大多数初学者来说,这是一个使他们非常困惑的话题。但是,只要您对指针有了适当的了解并学会使用它们,请相信我,您将永远不会回头。指针是一种不可抗拒的非常强大的编程结构。要理解- Why do we use pointers.... ,首先,您需要了解有关指针的知识。对于初学者,您可以参考thisthis

学习愉快...享受..