В обеих последних двух структурах вы выделили хранилище для структуры с именем person.
Что я имею в виду, если у вас есть что-то вроде этого:
struct person
{
int age;
char name[32];
};
Это просто декларация; Распределение переменных не существует и, следовательно, не может использоваться внутри кода. Вы можете начать использовать эту структуру после того, как объявите следующее:
struct person p1;
Тогда p1 можно использовать p1.age или p1.name и т. Д.
В терминах реального кода вместо
struct _person
{
int age;
char name[32];
}person;
мы обычно видим
typedef struct _person
{
int age;
char name[32];
} person_t;
В этом случае мы можем сохранить типизацию и, что более важно, структура ведет себя как любой другой встроенный тип, например int и т. Д.
Например,
person_t p1;
person_t * p1;
И т. Д.