путаница typedef в C - PullRequest
       14

путаница typedef в C

2 голосов
/ 21 декабря 2011

Мне трудно понять typedefs в этой C-структуре.

typedef struct node {
   int   value;
   list  rest;
} node;

typedef struct node *list;

В чем разница между объявлением typedef "node" и объявлением "list"? Почему список предваряется указателем? Разве «узел» также не является указателем? Почему я не могу просто сказать "typedef struct node list" и опустить звездочку? Я искал везде, и я не могу найти удовлетворительный ответ.

Ответы [ 5 ]

5 голосов
/ 21 декабря 2011

Первый typedef определяет node как псевдоним для struct node, чтобы вы могли ссылаться на него просто как node без записи struct node каждый раз (в C "обычные" имена типов и struct имена живут в двух разных пространствах имен). Это эквивалентно:

struct node
{
    int value;
    struct node* rest;
};

typedef struct node     node;

Второй typedef вместо этого определяет list как псевдоним для node *, то есть определяет тип list как указатель на структуру node.

(кстати, лично я нахожу, что это очень плохой стиль: скрывать указатели внутри typedef s почти всегда плохая идея; можно утверждать, что указатель на первый элемент в списке может быть идентифицирован как список, но использование list даже для указателя rest ИМХО не очень приятно)

1 голос
/ 21 декабря 2011

node - это struct, который (смущенно) назван так же, как struct node.list является указателем на struct node.Таким образом, следующие значения эквивалентны:

struct node *a;
node *a;
list a;
1 голос
/ 21 декабря 2011

В первом объявлении говорится, что node - это структура.Второй говорит, что list - это указатель на узел.

Таким образом, это будет правильный код с использованием этих объявлений:

list  x;
node  n;

x = &n;

Объявление элемента с использованием typedef struct node list не являетсяправильный.Оператор typedef объявляет новый тип.Ключевое слово typedef не является частью имени типа.

1 голос
/ 21 декабря 2011

node не является указателем;это struct.list - это typedef для указателя на node.

Вы typedef a struct на C, чтобы не вводить struct node ... везде.

Хорошо это или нетпрактика сомнительна (большинство согласится с тем, что скрывать тип указателя за typedef, если только он не является действительно непрозрачным, является плохой идеей), но в этом суть.

0 голосов
/ 21 декабря 2011

node - это просто синоним для struct node

list - это указатель на struct node (или node)

Каждый экземпляр узла содержит указатель list, который позволяет создавать структуры данных, такие как (отдельно) связанные списки и т. Д.

...