I puntatori a funzione sono molti utili anche in altri casi, ad esempio per scrivere codice generico, con un certo livello di astrazione.
ad esempio puoi creare un algoritmo per l'ordinamento che prende come parametro l'array da ordinare come void** e un puntatore ad una funzione di confronto
int (*confronta)(void *, void *)
che restituisce -1, 0, 1 a seconda che il primo argomento sia maggiore, uguale o minore del secondo.
Una volta che un algoritmo di ordinamento è in grado di confrontare due elementi dell'array (attraverso la funzione confronta), è anche in grado di ordinare qualsiasi tipo di array, perche astrae dal tipo effettivo degli elementi, di cui si tiene conto solo nella funzione 'confronta' passata come argomento.
Quindi se ti crei un array di interi puoi chiamare la funzioene di ordinamento passando come funzione di confronto ad esempio la seguente:
codice:
int confronta(void *a, void *b){
int aa = (int)*a;
int bb = (int)*b;
if(aa < bb)
return -1;
if(aa > bb)
return 1;
return 0;
}
ma la stessa funzione di ordinamento la puoi usare per ordinare un array di struct che hanno due campi interi 'primo' e 'secondo' e che vanno confrontati in base alla somma di tali campi:
codice:
typedef struct coppia{
int primo;
int secodo;
}coppia
int confronta(void *a, void *b){
coppia *aa = (coppia*)a;
coppia *bb = (coppia*)b;
if(aa->primo + aa->secondo < bb->primo + bb->secondo)
return -1;
if(aa->primo + aa->secondo > bb->primo + bb->secondo)
return 1;
return 0;
}
La libreria standard del c mette proprio a disposizione una funzione di ordinamento qsort che prende come parametro uan funzione di confronto e che qundi è in grado di ordinare array di qualsiasi tipo. Questa tecnica puo essere ampiamente utilizzata per implementare molti degli algoritmi piu diffusi, in cui spesso si puo astrarre rispetto al tipo specifico.