когда вы определяете структуру:
struct something
{
...
};
Вы создали новый тип, называемый «struct что-то».
Вы можете использовать это в своем приложении как:
struct something myvar;
Но большинству людей не нравится печатать struct (особенно с большим количеством указателей):
struct something *test = (struct something*)malloc(sizeof(struct something))
Поэтому вместо этого вы вводите определение по умолчанию (любым из описанных вами способов):
struct something
{
...
};
typedef struct _something someting;
или
typedef struct _something
{
...
} something;
Таким образом, когда вы используете структуру, вы можете сделать это:
something *test = (something*)malloc(sizeof(something))
Насколько вы ее определяете, не имеет значения.
Некоторым людям нравится помещать все свои typedef в один заголовочный файл, чтобы они могли typedef для структуры, указатель на структуру и т. Д.