Programmazione C · 3 min read · Nov 22, 2025
Linux C Programming Tutorial Parte 25 - Puntatori a funzioni

Fino ad ora in questa serie di tutorial sulla programmazione in C, abbiamo discusso il concetto di base dei puntatori così come diversi aspetti relativi ai puntatori, come il puntatore a un array e l’array di puntatori. Espandendo la nostra comprensione dei puntatori, in questo tutorial discuteremo il concetto di puntatori a funzioni.
Puntatori a funzioni nel linguaggio di programmazione C
Proprio come abbiamo puntatori a variabili, ci possono anche essere puntatori a funzioni. Di seguito è riportato un esempio di dichiarazione di un puntatore a funzione:
void (*fn_ptr)(int)Quindi qui abbiamo un puntatore a funzione chiamato ‘fn_ptr’ che può puntare a qualsiasi funzione che restituisce void e accetta un intero come input. È superfluo dire che questa è solo la parte di dichiarazione - come qualsiasi altro puntatore, è necessario assegnargli un indirizzo (quello di una funzione in questo caso) per poterlo utilizzare.
Di seguito è riportato un esempio che utilizza questo puntatore:
#include
void print_int(int a)
{
printf("\n Il valore intero è: %d\n",a);
}
int main()
{
void (*fn_ptr)(int);
fn_ptr = &print_int;
(*fn_ptr)(10);
return 0;
} Quindi, come puoi vedere, prima abbiamo definito una funzione ‘print_int’ che accetta un intero e restituisce void. Poi, nella funzione ‘main’, abbiamo dichiarato ‘fn_ptr’ come un puntatore a funzione che può puntare a funzioni come ‘print_int’. Questo è stato seguito dall’assegnazione dell’indirizzo della funzione ‘print_int’ a ‘fn_ptr’, e infine, effettuando una chiamata alla funzione utilizzando il puntatore.
Ecco l’output prodotto:
Il valore intero è: 10 Vale la pena menzionare qui che puoi semplificare ulteriormente questo programma evitando & e * dalle ultime due righe. Di seguito è riportato il codice modificato:
#include
void print_int(int a)
{
printf("\n Il valore intero è: %d\n",a);
}
int main()
{
void (*fn_ptr)(int);
fn_ptr = print_int;
fn_ptr(10);
return 0;
} Procedendo, come un array di puntatori, puoi anche avere un array di puntatori a funzioni. Ad esempio, di seguito è riportato un array di puntatori a funzioni in grado di memorizzare 3 indirizzi di funzioni.
void (*fn_ptr[3])(int)E di seguito è riportato un esempio che utilizza questo array di puntatori:
void print_int1(int a)
{
printf("\n Il valore intero è: %d\n",a);
}
void print_int2(int a)
{
printf("\n Il valore intero è: %d\n",a+1);
}
void print_int3(int a)
{
printf("\n Il valore intero è: %d\n",a+2);
}
int main()
{
void (*fn_ptr[3])(int);
fn_ptr[0] = print_int1;
fn_ptr[1] = print_int2;
fn_ptr[2] = print_int3;
fn_ptr[0](10);
fn_ptr[1](10);
fn_ptr[2](10);
return 0;
}Ecco l’output prodotto da questo codice:
Il valore intero è: 10
Il valore intero è: 11
Il valore intero è: 12Un altro aspetto dei puntatori a funzioni di cui dovresti essere a conoscenza è che puoi usarli anche come argomenti di funzione. Ad esempio, può esserci una funzione che accetta un puntatore a una funzione come argomento. Ad esempio:
void some_random_func(void (*fn_ptr)(int)) Di seguito è riportato un esempio di codice che utilizza questa funzione:
#include
void another_random_func(int a)
{
printf("\n Il numero intero inserito è: %d\n", a);
}
void some_random_func(void (*fn_ptr)(int))
{
fn_ptr(5);
}
int main()
{
some_random_func(another_random_func);
return 0;
} Quindi quello che abbiamo fatto qui è stato creare una funzione chiamata ‘some_random_func’ che accetta un puntatore a funzione come input. Poi, da ‘main’, abbiamo chiamato ‘some_random_func’ con l’indirizzo di un’altra funzione ‘another_random_func’ come argomento. Poi, utilizzando il puntatore, abbiamo chiamato con successo ‘another_random_func’.
Ecco l’output:
Il numero intero inserito è: 5 Conclusione
I puntatori a funzioni possono essere utili quando vuoi creare qualcosa chiamato un ‘meccanismo di callback’ (leggi di più su di esso qui). Ma prima di entrare in questo, è meglio se ottieni una buona comprensione di questo concetto. Ti suggeriamo di provare gli esempi di questo tutorial sulla tua macchina locale (e anche di crearne di nuovi). In caso di dubbi o domande, lascia un commento qui sotto.
Ricevi i nuovi post nella tua casella di posta.
Nessuno spam. Disiscriviti in qualsiasi momento.