L'utilità dei puntatori a funzione è questa. Hai una funzione generica che compie sempre la stessa sequenza di azioni su un'oggetto, una di questa azioni deve cambiare, al posto di scrivere svariate volte la stessa funzione la scrivi una sola volta e passi come parametro una funzione che svolga questa azione.
Ad esempio è utile un puntatore a funzione con le liste e le funzioni di folding e mapping.
codice:
return_type (*nome_variabile) (type1, type2 ... typen);
Esempio:
codice:
int apply (int a, int b, int (*azione) (int, int)) {
return (*azione)(a, b);
}
int sum (int a, int b) {
return a + b;
}
int prod (int a, int b) {
return a * b;
}
int main () {
printf("%d\t%d", apply(2, 3, &sum), apply(2, 3, &prod));
}
Volendo essere del tutto rigidi, in realtà anche:
codice:
return azione(a, b);
apply(2, 3, sum);
apply(2, 3, prod);
Funzionano con praticamente tutti i compilatori, anzi sono più usati: non trovi mai l'& prima del nome della funzioni, quasi nessuno deferenzia il puntatore alla chiamata.
Ovviamente l'esempio postato non è di grande utilità...