Lucido 2: I puntatori sono indirizzi di celle. Non c'è motivo per cui debbano puntare a celle che contengono dati. Infatti, possono puntare anche a celle che contengono istruzioni, in particolare la prima istruzione di una funzione. Tutto ciò che serve è definire il modo in cui tali puntatori possono venire dichiarati e poi usati in pratica. Lucido 3: La dichiarazione incrocia quella dei puntatori (ad es.: tipo *) con quella delle funzioni (ad es.: f(tipo1 dato1, tipo2 dato2)). Si noti la differenza tra double (*pf) (int,int); che dichiara un puntatore a funzione e double *pf (int,int); che dichiara una funzione che restituisce un puntatore Le parentesi evidenziano le precedenze fondamentali, cioè il fatto che il simbolo * va associato al nome di funzione nel primo caso, al tipo double nel secondo. Non occorre dare nomi ai parametri dei puntatori a funzione, perché non si tratta di funzioni, ma solo di indirizzi. Non è però vietato: è inutile, dato che quei nomi non si useranno mai. Infatti, la funzione è definita altrove, i suoi parametri hanno già dei nomi e la funzione viene chiamata con il puntatore, ma eseguita usando i nomi dei parametri originali. Osserviamo di passaggio che costruire una struttura contenente un puntatore a funzione pone le basi per avere oggetti che contengono le proprie funzioni, cioè classi contenenti metodi, secondo la nomenclatura della programmazione a oggetti. Il codice POINTFUNC.C dichiara un puntatore pf a funzione di due variabili intere con valore double, e un vettore V di 4 puntatori a funzione di variabile double con valore double. Poi assegna a pf la funzione "funzione", che calcola la media geometrica di due numeri (radice quadrata del loro prodotto) e la chiama sia con il formato pf(10,20) sia con il formato (*pf)(10.20). Quindi, assegna agli elementi di V le funzioni seno, coseno, tangente e radice quadrata e le chiama sui numeri compresi fra 0 e pi greco, per intervalli di 0.1. Il codice INTEGRALE.C calcola l'integrale approssimato con passo delta delle funzioni seno, coseno e radice quadrata, fra due valori a e b forniti dall'utente da linea di comando. L'integrale viene calcolato facendo le somme parziali dei valori delle tre funzioni in punti spaziati regolarmente di un intervallo delta. La funzione che calcola l'integrale è la stessa in tutti i casi, e riceve come primo parametro il puntatore alla funzione della quale deve calcolare l'integrale. Internamente alla funzione "integrale" la funzione primitiva viene indicata come "pf". Ovviamente, se l'utente definisce una funzione f, può calcolarne l'integrale definito usando lo stesso codice: basta che gli passi un puntatore a f (&f). Si provi a farlo per esercizio.