Dichiarare puntatori a funzione
Puntatori a funzioni
Dichiarare puntatori a funzione è una lezione C Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C Academy include 4 lezioni in totale.
Le funzioni hanno indirizzi
Proprio come i dati, ogni funzione risiede a un indirizzo in memoria. Un puntatore a funzione memorizza quell'indirizzo, permettendo di chiamare la funzione indirettamente.
#include <stdio.h>
void greet(void) { printf("hello\n"); }
int main(void) {
void (*fp)(void) = greet;
fp();
return 0;
}Leggere la dichiarazione
La dichiarazione int (*fp)(int) significa che fp è un puntatore a una funzione che accetta un int e restituisce un int.
Le parentesi intorno a *fp sono obbligatorie.
#include <stdio.h>
int square(int x) { return x * x; }
int main(void) {
int (*fp)(int) = square;
printf("%d\n", fp(5));
return 0;
}Assegnare una funzione
Il nome di una funzione si converte nel suo indirizzo, quindi fp = square e fp = &square sono equivalenti.
#include <stdio.h>
int dbl(int x) { return x * 2; }
int main(void) {
int (*fp)(int);
fp = &dbl;
printf("%d\n", fp(7));
return 0;
}Chiamare tramite il puntatore
È possibile chiamare una funzione tramite un puntatore a funzione con fp(args) oppure con la forma esplicita (*fp)(args). Entrambe producono lo stesso risultato.
#include <stdio.h>
int add1(int x) { return x + 1; }
int main(void) {
int (*fp)(int) = add1;
printf("%d\n", fp(10));
printf("%d\n", (*fp)(10));
return 0;
}La firma deve corrispondere
Il tipo di un puntatore a funzione include il tipo restituito e i tipi dei parametri. È possibile assegnargli solo una funzione con una firma esattamente corrispondente.
#include <stdio.h>
double half(double x) { return x / 2.0; }
int main(void) {
double (*fp)(double) = half;
printf("%f\n", fp(9.0));
return 0;
}Riassegnare durante l'esecuzione
Un puntatore a funzione è una variabile, quindi è possibile indirizzarlo verso funzioni diverse mentre il programma è in esecuzione.
#include <stdio.h>
int inc(int x) { return x + 1; }
int dec(int x) { return x - 1; }
int main(void) {
int (*op)(int) = inc;
printf("%d\n", op(5));
op = dec;
printf("%d\n", op(5));
return 0;
}Scegliere in base a una condizione
Selezioni la funzione da chiamare in base a un valore determinato durante l'esecuzione, quindi la invochi tramite un unico puntatore.
#include <stdio.h>
int plus(int a) { return a + 10; }
int minus(int a) { return a - 10; }
int main(void) {
int up = 1;
int (*op)(int) = up ? plus : minus;
printf("%d\n", op(100));
return 0;
}typedef per una maggiore leggibilità
La sintassi dei puntatori a funzione è prolissa. Un typedef assegna un nome al tipo, rendendo più chiare le dichiarazioni.
#include <stdio.h>
typedef int (*IntOp)(int);
int triple(int x) { return x * 3; }
int main(void) {
IntOp op = triple;
printf("%d\n", op(4));
return 0;
}Funzioni con due argomenti
I puntatori a funzione possono descrivere qualsiasi firma. Ecco un puntatore per un'operazione binaria su interi.
#include <stdio.h>
int sum(int a, int b) { return a + b; }
int main(void) {
int (*op)(int, int) = sum;
printf("%d\n", op(3, 4));
return 0;
}Un puntatore a funzione nullo
Come i puntatori ai dati, anche un puntatore a funzione può essere NULL. Verifichi sempre il puntatore prima di chiamare una funzione che potrebbe non essere stata impostata.
#include <stdio.h>
int twice(int x) { return x * 2; }
int main(void) {
int (*op)(int) = NULL;
if (op == NULL) op = twice;
if (op) printf("%d\n", op(8));
return 0;
}Stampare l'indirizzo
È possibile esaminare l'indirizzo memorizzato. Funzioni diverse hanno indirizzi diversi.
#include <stdio.h>
int f(int x) { return x; }
int main(void) {
int (*fp)(int) = f;
printf("function pointer is %s\n", fp ? "set" : "null");
return 0;
}Verifica rapida
Verifichi la Sua comprensione delle dichiarazioni dei puntatori a funzione.
Riepilogo
Ha imparato a dichiarare e utilizzare i puntatori a funzione:
- Sintassi:
ret (*name)(params), con parentesi obbligatorie. - Assegnare il nome della funzione, che si converte in un indirizzo.
- Chiamare con
fp(args)o(*fp)(args). - La firma deve corrispondere;
typedefmigliora la leggibilità.
Domande Frequenti
La lezione «Dichiarare puntatori a funzione» è gratuita?
Sì — il testo completo di «Dichiarare puntatori a funzione» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C Academy, passa a CoddyKit PRO. Il corso C Academy include 4 lezioni in totale.
Cosa imparerò in «Dichiarare puntatori a funzione»?
Puntatori a funzioni Eserciti C Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare C Academy?
Non è richiesta alcuna esperienza precedente. C Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.
Quanto tempo richiede la lezione «Dichiarare puntatori a funzione»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione C Academy?
Sì. Ogni lezione C Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Dichiarare puntatori a funzione
- Passare funzioni
- qsort con comparatori
- Tabelle di puntatori a funzione