Ca sert simplement à faciliter la maintenance de ton programme. Par exemple, tu fais un tableau d'une taille de 255 par exemple. A plusieurs endroits de ton code, tu écriras tab[255], dans des boucles, des pasages de paramètres etc...
Et le jour où tu te rends compte qu'en fait 255 c'est pas assez (ou trop), il va falloir que tu cherches dans ton code TOUS les endroits où t'as écrit tab[255] pour changer le 255.
Si au début de ton code, t'avais fait un #define MAX_TAILLE 255, t'aurais déclaré tab[MAX_TAILLE] et partout où t'aurais eu à indiquer la dimension de ton tableau, t'aurais mis MAX_TAILLE au lieu de 255.
Quel est l'interêt ?
En fait, #define est une constante de préprocesseur, c'est à dire que le préprocesseur (avant la compilation donc) va chercher dans ton code tous les MAX_TAILLE et les remplacer par la valeur correspondante (255). Le jour où t'as envie de changer la valeur, tu n'auras qu'à changer la valeur de MAX_TAILLE au lieu de chercher tous les tab[255] : ils seront remplacés automatiquement par la nouvelle valeur que t'auras indiqué dans MAX_TAILLE.
Idem pour les fonctions