Typedef / Глобальная структура в C, без использования "typedef"? - PullRequest
0 голосов
/ 13 апреля 2020

Язык: C

Я буду sh Я знал, как лучше ссылаться на это в названии. Недавно я наткнулся на этот фрагмент кода, касающийся определения структуры, и я не знаком с синтаксисом, особенно с частью "* Node". Может кто-нибудь, пожалуйста, помогите мне понять, что происходит? Почему / как мы не используем typedef / это что-то совсем другое? Для дальнейшего использования, исходный код использует «Node» (без * звездочки) в некоторых определениях функций без передачи или объявления каких-либо переменных «Node» в самой функции. Это заставляет меня думать, что это своего рода объявление глобальной переменной. Любая помощь приветствуется!

struct node {
    char word[MAX];
    struct node *left;
    struct node *right;
} *Node;

Ответы [ 2 ]

2 голосов
/ 13 апреля 2020

В объявлении struct за правой скобкой, которая завершает список членов, может следовать список переменных . Итак, здесь

struct node {
    char word[MAX];
    struct node *left;
    struct node *right;
} *Node;

Node имеет тип struct node *, который может содержать указатель на любую переменную типа struct node. Это означает, что если у вас есть

struct node anode;

, вы можете сделать

Node = &anode;

Если у вас есть такая глобальная декларация struct, за которой следуют переменные после правой скобки, которая завершает список члены, тогда все эти переменные являются глобальными переменными этого struct типа. Это означает, что если у вас

struct node {
    char word[MAX];
    struct node *left;
    struct node *right;
} Node, *ptrNode;

и этот тип struct node определен глобально, тогда и Node, и ptrNode являются глобальными переменными.

Не путайте это с typedef. typedef используется для создания псевдонима для другого типа данных.

Например,

tyepdef struct node {
    char word[MAX];
    struct node *left;
    struct node *right;
} stNode, *ptrStNode;

Теперь stNode - псевдоним struct node, а ptrStNode - псевдоним struct node *. Это означает, что вы можете использовать их для объявления переменных типа struct node и struct node* соответственно.

Для типа struct node этот

stNode aNode;

совпадает с

struct node aNode;

и для struct node * типа

ptrStNode ptrNode;

совпадает с

stNode *ptrNode;

аналогично

struct node *ptrNode;

Надеюсь, это поможет.

1 голос
/ 13 апреля 2020

Код определяет имя указателя от Node до struct. См. объявление узла как указателя на узел структуры ;

Возможно, это более понятно, если разбить его на двухэтапный эквивалентный код.

  // Define `struct node`
  struct node {
      char word[MAX];
      struct node *left;
      struct node *right;
  };

  // Define & declare a pointer: `Node`
  struct node *Node;

Почему / как мы не используем typedef / это что-то совсем другое?

Автор не хотел определять псевдоним для типа struct main через typeface. Просто чтобы определить тип с именем struct main и объявить указатель.

...