Altra caratteristica assolutamente peculiare del C, è la possibilità di usare puntatori a funzioni.
Caratteristica, questa, assai di rilievo dove ci si trovi a dover implementare dei parser di espressioni, che si trovino a dover richiamare, in maniera snella ed elegante, molti moduli diversi scritti separatamente.
Ovvero, mantenere degli array di puntatori a funzione potrebbe essere utile, nella pratica, per scrivere la barra delle funzioni di un editor di testo, in modo da poter implementare e testare separatamente i vari blocchi di codice, e poterli poi richiamare in una maniera che somiglia assai ai moderni paradigmi di programmazione ad oggetti. Il tutto nell'ottica di mantenere il più alto grado possibile di modularità.
Dal punto di vista pratico, è possibile realizzare un puntatore a funzione sulla scorta della seguente considerazione: visto che mediante i puntatori è possibile accedere pressochè ad una qualsiasi locazione di memoria, e giacchè una funzione occuperà una di queste locazioni, basta far sì che esista un puntatore che "punti" alla locazione che interessa, per poter lanciare l'esecuzione della funzione utile.
Un puntatore a funzione si dichiara usando la convenzione di racchiudere tra parentesi il nome della funzione e facendolo precedere da un asterisco, così:
int (*func)(<parametri>)
E si comporta, per il resto, come un qualsiasi altro tipo di puntatore, costituendo, di fatto, la medesima cosa: l'indirizzo di una locazione di memoria
Come ormai il lettore si sarà abituato, quanto detto viene messo in pratica nel sorgente che segue:
1 /*
2 Mostra l'uso dei puntatori a funzione
3 */
4 #include<stdio.h>
5
6 int sottrazione(int, int);
7 int somma (int, int);
8 int prodotto(int, int);
9 int divisione(int, int);
10
11
12 int main()
13 {
14 int a = 48;
15 int b = 2;
16 int risultato,scelta;
17 int (*puntatore)();
18 for(;;){
19 printf("1\t per la somma\n");
20 printf("2\t per la sottrazione\n");
21 printf("3\t per il prodotto\n");
22 printf("4\t per la divisione\n");
23 printf("0\t per uscire\n");
24
25 scanf("%d", &scelta);
26 switch(scelta){
27 case 1:
28 puntatore = somma;
29 break;
30 case 2:
31 puntatore = sottrazione;
32 break;
33
34 case 3:
35 puntatore = prodotto;
36 break;
37
38 case 4:
39 puntatore = divisione;
40 break;
41 case 0:
42 exit(0);
43
44 }
45
46 risultato = puntatore(a,b);
47 printf("Il risultato vale %d", risultato);
48 break;
49
50 }/* fine for */
51
52 }
53
54 int somma(int a, int b)
55 {
56 return a+b;
57 }
58
59 int sottrazione(int a, int b)
60 {
61 return a-b;
62 }
63
64 int prodotto(int a, int b)
65 {
66 return a*b;
67 }
68
69 int divisione(int a, int b)
70 {
71 return (a/b);
72 }
73
Si può riconoscere nella riga
int (*puntatore)();la dichiarazione di un puntatore a funzione; il riferimento alla particolare funzione, viene fatto nel ciclo switch(), nel quale viene assegnato a puntatore uno dei possibili tipi previsti dal programma, con un'assegnazione del tipo:
puntatore = prodotto;A cui deve corrispondere, chiaramente, una funzione dichiarata come solito es.:
int prodotto(int a, int b)
{
return a*b;
}
oppure corrispondente ad una funzione di libreria.