Riguardando il codice effettivamente ero riuscito a capirlo, particamente così facendo puoi passare nel parametro "puntatore" una funzione, e magari, scegliere di volta in volta che funzione passargli come parametro.Originariamente inviato da MItaly
Un puntatore a funzione è una variabile che contiene l'indirizzo di una funzione, che tramite esso può essere richiamata. È utilizzato dal codice che hai riportato per permettere al chiamante di fornire una sua funzione di confronto personalizzata; la chiamata della funzione in questione la trovi alla riga
dalla sintassi apparentemente contorta ma coerente con la sintassi solita dei puntatori: il puntatore a funzione viene dereferenziato, consentendo così la chiamata a funzione.codice:if ( (*compare)( work[ count ], work[ count + 1 ] ) ) {
Tendenzialmente comunque si cerca di evitare di specificare i parametri di tipo puntatore a funzione in quella maniera perché sono abbastanza illeggibile; di solito infatti si usano dei typedef per renderli un po' meno ostici.
I puntatori a funzione, oltre che per situazioni come questa, si usano moltissimo per consentire al chiamante di specificare una funzione di callback, per esempio per notificarlo dell'avanzamento di un'operazione o del verificarsi di un evento.
Ho visto un esempio, molto più capibile, che implementavano questo passaggio di puntatore a funzione per l'utilizzo in un menù:
Praticamente era il classico ciclo while che a seconda della scelta del menù richiamava una funzione, però in realtà si richiamava "un vettore di puntatori a funzione" e la scelta del menù era l'indice di questo vettore.
Nel caso citato prima invece non riuscivo a capirne il nesso perchè aveva veramente poco senso la cosa. Secondo me bisognerebbe spiegare le potenzialità di una funzione mostrandone l'utilizzo per "un azione" che non si potrebbe fare in altro modo. Mostrare la via più complicata di una cosa semplice diventa illogico e quindi difficile da capire.