Я [...] был немного удивлен, увидев указатель typedef'd на структуру
Я бы не описал объявление, которое вы представили.Рассмотрим код
typedef mach_port_name_t *mach_port_name_array_t;
Если бы ключевое слово typedef
отсутствовало, тогда оно объявило бы mach_port_name_array_t
как указатель на объект типа mach_port_name_t
, который оказываетсятип конструкции.Указатели на структуры являются в C обычным делом, поскольку в C имеется встроенный оператор (->
) для доступа к членам структуры через указатель.
Добавление typedef
просто делает объявленный идентификатор(mach_port_name_array_t
) псевдоним типа для этого типа вместо объекта этого типа.Вы можете сделать это, чтобы создать псевдоним типа для любого типа, поэтому создание псевдонима для типа указатель на структуру совершенно допустимо.
С другой стороны, хотя создание псевдонимов типов не так уж редко,это плохой стиль.В большинстве случаев typedef
, которые скрывают природу указателя типа, производят больше путаницы, чем ясности.Соглашения об именах могут помочь с этим, но не настолько, как отказ от таких типов.
Более того, в данном конкретном случае имя вводит в заблуждение.Это предполагает, что тип является типом массива, когда это не так.Однако это правильный тип указателя для параметра функции, фактический аргумент которого должен быть массивом:
void do_something_with_ports(mach_port_name_array_t port_names);
// ...
mach_port_name_t ports[3];
// ...
do_something_with_ports(ports);
Однако, как я уже сказал, использование указателя typedef будет плохим стилем.Функция была бы лучше объявлена так:
void do_something_with_ports(mach_port_name_t *port_names);
или, что эквивалентно,
void do_something_with_ports(mach_port_name_t port_names[]);