Всё очень просто. Enum используется, когда вариантов значений не очень много и они заранее известны. Например простейший светофор имеет три цвета:
typedef enum {
red,
yellow,
green
} color;
Теперь определив переменную типа color мы можем присваивать ей значение не в виде числа, а в виде цвета.
color traffic_light_state;
traffic_light_state = red;
По умолчанию C трактует значения enum как целые числа начиная с нуля. Поведение можно изменить прямым указанием, например
typedef enum {
red = -1,
yellow,
green = 3
} color;
определит red как -1, yellow как 0 (-1 + 1), green как 3.