Dodam tylko, że oprócz skrócenia długich nazw typów (namiętnie stosowane przy szablonach i niektórych wskaźnikach), można tym wprowadzać zmiany na poziomie semantycznym, nadając jednemu typowi danych kilka różnych znaczeń, w zależności od kontekstu użycia.
Przykładowo możesz zrobić typedefy dla inta, które będą podpowiadały intencję już w prototypie, chociaż tak naprawdę będą to zwykłe liczby całkowite.
typedef int IdMusic;
typedef int IdPicture;
bool playMusic(IdMusic song) // czytelniejsza intencja, niż "int song"
{
}
bool drawPicture(IdPicture image) // znów - czytelniej, niż int image
{
}