Volgens mij krijg je met de eerste constructie een struct dier met die declaratie.
Met de tweede krijg je niks, maar kun je variabelen definieren als zijnde een kat, die dan die hele struct def heeft. Als je die struct veel gebruikt scheelt je dat veel typewerk én veel fouten.
Met de typedef kun je dus het volgende:
kat dier;
Waardoor dier dus dezelfde structdef krijgt als bij de eerste mogelijkheid. De naam kat is dus niet zo handig gekozen, je zou eerder voor dier kiezen.