C typedef указателя на структуру

Я столкнулся с следующим кодом:

typedef struct { double x; double y; double z; } *vector; 

Является ли это допустимым определением типа? Код компилируется и работает нормально. Мне было просто любопытно, если это обычная практика.

Абсолютно верно. Обычно вы можете в полной мере воспользоваться этим путем, объединив два типа:

 typedef struct { int a; int b; } S1, *S1PTR; 

Где S1 является структурой и S1PTR является указателем на эту структуру.

Да. Но это плохой стиль. Не прямое объявление структуры, а прямое объявление типа указателя. Это обфускация, информация о том, что данная переменная или параметр является указателем (и в меньшей степени для массивов), крайне важна, когда вы хотите прочитать код.

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

 int do_fancy(vector a, vector b); 

или

 int do_fancy(vector *a, vector *b); 

в первом случае я могу легко пропустить, что эта функция может изменить содержание a или b. Во втором я предупрежден.

И когда на самом деле писать код, я также знаю непосредственно писать a->x и не компилятор сказать мне error: request for member x ‘в чем-то не структура или объединение`.

Я знаю, это похоже на личную вещь вкуса, но, работая с большим количеством внешнего кода, я могу заверить вас, что это очень раздражает, когда вы не понимаете уровень переменных направления. Это одна из причин, по которой мне также не нравятся ссылки на C ++ (в Java это происходит не потому, что все объекты передаются по ссылке, это непротиворечиво) и типы типов LPCSTR от Microsoft.

Да, это действительно так. Если вам нужно больше «безопасности», вы также можете сделать

 typedef struct vector_{ double x; double y; double z; } *vector; 

то вы можете использовать оба

 struct vector_ *var; vector var; 

Но не забывайте о концевой двоеточии.

Использование только typedef означает, что вы так называете его. в противном случае это было бы более или менее анонимным.

Он действительный, то, что он делает, определяет новый тип. Как сказал @Alex, было бы полезно определить тип и тип указателя.

Вы можете создать больше указателей, просто используя

 S1PTR ptr1, ptr2, ptr3, ...; 

вместо

 S1 *ptr1, *ptr2, *ptr3, ...; 

Да, это действительно так, как описано в приведенных выше ответах. Небольшое предложение, было бы лучше, если бы вы указали название тега, как показано ниже. Это поможет некоторым IDE лучше разобрать ваш код.

 typedef struct vactor_tag { double x; double y; double z; } *vector; 

да … избавляет вас от необходимости постоянно печатать слово «struct» каждый раз, когда вы объявляете векторную структуру или указатель на нее.

  • В C, какой правильный синтаксис для объявления указателей?
  • Почему массивы в C распадаются на указатели?
  • Причина передачи указателя по ссылке в C ++?
  • Почему polymorphism не работает без указателей / ссылок?
  • Что возвращает sizeof (& array)?
  • Как использовать массивы на C ++?
  • Запрещен ли указатель на «внутреннюю структуру»?
  • Приемник значений против приемника указателя в Голанге?
  • Как сделать буквенный * int64 в Go?
  • Почему int указатель «++» увеличивается на 4, а не на 1?
  • Указатель функции Typedef?
  • Давайте будем гением компьютера.