#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;
.