Puntatori a Funzione - STB1019/SkullOfSummer GitHub Wiki

Puntatori a funzione

Nelle altre pagine della wiki sono presenti vari esempi di puntatori(aritmetica, vettori, variabili, strutture,etc...). In questa sezione verrà esposto l'uso dei puntatori a funzione.

La sintassi del prototipo è:

int (*f)(int,int);

le parentesi extra sono necessarie, infatti questa dichiarazione:

int *f(int,int);

prototipa una funzione che ritorna un puntatore ad int.

si può anche definire un tipo con la keyword typedef:

int foo(int a, int b){return a+b;}
...
typedef int (*f)(int,int);
f bar = &foo;
...

Dove e Quando

Si supponga di definire una funzione che interessa altre funzioni nell'esecuzione del suo compito. Questa, in dipendenza dal compito, può essere scritta in modo più generale, con un parametro puntatore a funzione in modo da avere un comportamento diverso a seconda del contesto o delle necessità. Un esempio chiarificatore è la funzione qsort definita in stdlib: il suo prototipo è

void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));

ciò significa che definendo più funzioni compar, è possibile ordinare un vettore in modi diversi. La funzione necessaria a qsort deve rispettare il prototipo definito dal puntatore(argomenti, valore ritornato) ed essere utile all'ordinamento: la più usata ritorna la differenza fra due valori presi dal vettore passato e interpreta il risultato(><= 0). La qsort è una funzione molto generale in questo senso, ed è in grado di ordinare non soltanto vettori di interi ma anche di tipi di dato complessi(cfr il tipo di argomento).

Questo è un esempio di una tra le molte altre funzioni presenti in libgc che richiedono la "descrizione del comportamento necessario al programmatore". Per questo i puntatori a funzione sono molto utili quanto usati nelle varie tipologie di programmi.

Fonti

Sorgente libgc di qsort: https://code.woboq.org/userspace/glibc/stdlib/qsort.c.html fà uso di QuickSort

https://www.eskimo.com/~scs/cclass/int/sx10a.html

Da StackOverflow

https://stackoverflow.com/questions/14114749/c-function-pointer-syntax