Невозможно понять "typedef" и использование указателя в структурах (C) - PullRequest
0 голосов
/ 15 мая 2019

Мои вопросы связаны с очень ранними этапами изучения списков в CI, я не смог найти четкого ответа на мои вопросы, где бы это ни было, с самым простым кодом, который есть. ( Я собираюсь дать вам пример того, что я не совсем понимаю в очень простом коде, просто для того, чтобы вы поняли, где я теряю понимание. Это тот же вопрос, что и у меня, с более сложными. )

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

я получаю, какие данные и next используются как переменные, но я не понимаю: что struct node * next действительно означает . Мы создаем новую структуру с именем next, в которой есть новые данные и следующие члены ? То, что я тоже не понимаю, это * использование в следующем.

** Ниже приведен код, который предназначен для создания вкладок и добавления адресов сайтов к этим вкладкам. Вид того, что будет делать borwser.InfoSession в информационном коде. Список, который я создаю, представляет собой двойной связанный список. ** Но я не понимаю двух вещей: 1) Что на самом деле означает LastTab TabNodePtr, например? Является ли LastTab новой структурой, которая имеет все вышеперечисленное:

TabNodePtr PrevTab, NextTab;
SiteNodePtr FirstSite;
SiteNodePtr CurrSite;

как члены? То же с SiteNodePtr s. Я не понимаю, как они все связаны друг с другом, для меня сейчас это шар рождественских гирлянд. 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 Ответ

1 голос
/ 15 мая 2019

Вам предстоит пройти долгий, длинный путь ....

Позвольте мне попробовать, если я смогу немного помочь вам в вашем путешествии по изучению языка C.

что на самом деле означает struct node *next. Мы создаем новую структуру с именем next, которая содержит новые данные и next членов? Что я также не получаю, так это использование * в next.

struct node *next;

Этот оператор объявляет переменную с именем next типа struct node *, что означает next указатель, который может указывать на адрес типа struct node.
Например, в операторе int *p; переменная p имеет тип int *, что означает, что p является указателем, который может указывать на int. [Для указателей, проверьте это или это или Google или обратитесь к любой хорошей книге] .

Вы когда-нибудь слышали о Само-ссылочная структура в C?
Само-ссылочная структура - это структура, в которой один из ее членов является указателем на саму структуру.

Итак, вэто объявление структуры:

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

struct node является самоссылочной структурой. [Для получения более подробной информации о проверке самоссылочной структуры это и для проверки его использования это ].

Но я неt понять две вещи: 1) Что на самом деле, например, TabNodePtr LastTab означает? Является ли LastTab новой структурой, которая имеет все вышеперечисленное ....

Прежде всего, внимательно прочитайте оуказатели (точнее указатель на структуру) в C.

typedef используется для создания псевдонима для другого типа данных. [Подробнее о typedef здесь и о typedef struct здесь или ссылаться на любую хорошую книгу.]

Итак, когда вы пишете

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? - Это очень естественный вопросдля тех, кто не знает или очень мало знает об указателяхв Си и для большинства начинающих это тема, которая их сильно смущает.Но поверьте мне, как только вы получите правильные знания о указателях и научитесь ими пользоваться, вы никогда не вернетесь назад.Указатели - это неотъемлемо мощная программная конструкция.Чтобы понять - Why do we use pointers...., сначала вы должны получить знания об указателях.Для начала вы можете сослаться это и это .

Счастливое обучение .... наслаждайтесь ..

...