Имеет ли смысл иметь как имя, так и указатель на структуру?

#c #pointers #struct #coverity

Вопрос:

 typedef struct net_path_s
{
    uint8    path_len;                     /* network path length */
    uint8    net_path[2 * MAX_ROUTE_LEN];  /* network path */
} net_path_t, *net_path_pt;
 

Указатель предназначен для структуры.
Имеет ли смысл иметь и имя, и указатель? И почему они им пользуются?

Комментарии:

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

Ответ №1:

Поскольку это объявление является a typedef , оно определяет типы, а не переменные. net_path_t является другим именем для этого типа структуры и net_path_pt другим именем для указателя на этот тип структуры. Вам не нужно иметь и то, и другое.

По какой-то причине некоторые люди предпочитают писать net_path_pt вместо net_path_t* этого . Определение типов указателей, по-видимому, часто встречается в старых API.

Ответ №2:

Это 2 вещи (или, возможно, даже 3), сделанные одновременно. Их можно разложить на первые:

 struct net_path_s
{
    uint8    path_len;                     /* network path length */
    uint8    net_path[2 * MAX_ROUTE_LEN];  /* network path */
};
 

это определяет a struct .

И второе:

 typedef net_path_s net_path_t, *net_path_pt;
 

это создает два typedef s. Один net_path_t из них является псевдонимом net_path_s , а другой- net_path_pt псевдонимом net_path_s* .

Последнее концептуально является «созданием типа указателя».

Синтаксис C-это «указатель на тип X». На это есть char и char* есть указатель. char* выглядит как простой вариант char , как в char a, *b, c; .

Людям обычно легче думать способом «типа указателя на X». Так что это обоснование для typedef char* , например. pstr . Теперь pstr выглядит как собственный тип. Поэтому ты пишешь char a, c; pstr b; .