Для структурування і групування (агрегації, ще кажуть) зв'язаних даних.
Порівняйте:
/*перевіряє, чи точка потрапляє в прямокутник*/
int pointInRect(int rectangleTop, int rectangleLeft, int rectangleBottom, int rectangleRight, int pointX, int pointY)
{
  return ( pointX > rectangleTop    ) && 
         ( pointX < rectangleBottom ) && 
         ( pointY > rectangleLeft   ) && 
         ( pointY < rectangleRight  );
}
/*і ще 10 схожих функцій, які активно викликають одна одну*/
з
typedef struct 
{
  int x, y;
}Point;
typedef struct 
{
  Point topLeft, bottomRight;
}Rectangle;
/*правда, тепер важко заплутатися в параметрах?*/
int pointInRect( Rectangle rectange, Point point )
{
  return ( point.X > rectangle.topLeft.X     ) &&
         ( point.X < rectangle.bottomRight.X ) && 
         ( point.Y > rectangle.topLeft.Y     ) && 
         ( point.Y < rectangle.bottomRight.Y );
}
Проголошення типів зайняло трохи місця, але тепер ви точно не зможете передати в функцію одну з координат не того прямокутника (і, відповідно, не вб'єте 3 години на пошук незрозумілого бага), і сама функція стала значно коротше викликатися - тобто місце витрачене не дарма.