Puntatori a funzione
Passare funzioni come argomenti
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.
Che cos'è un puntatore a funzione?
Un puntatore a funzione memorizza l'indirizzo di una funzione, consentendo di chiamarla indirettamente o di passarla come un dato.
- Il tipo codifica la firma.
- Permette alle funzioni di ricevere un comportamento come parametro.
#include <iostream>
int add(int a, int b) { return a + b; }
int main() {
int (*op)(int, int) = add;
std::cout << op(3, 4) << '\n';
return 0;
}Dichiarare il tipo
La dichiarazione int (*op)(int, int) si legge così: op è un puntatore a una funzione che accetta due int e restituisce un int. Le parentesi intorno a *op sono obbligatorie.
#include <iostream>
int square(int x) { return x * x; }
int main() {
int (*fn)(int) = square;
std::cout << fn(5) << '\n';
return 0;
}Chiamare tramite un puntatore
Un puntatore a funzione si chiama proprio come la funzione stessa. È anche possibile dereferenziarlo esplicitamente, ma raramente è necessario.
#include <iostream>
void greet() { std::cout << "Hello\n"; }
int main() {
void (*g)() = greet;
g();
(*g)();
return 0;
}Passare funzioni come argomenti
Una funzione può accettare un parametro puntatore a funzione, consentendo al chiamante di inserire un comportamento personalizzato.
#include <iostream>
int apply(int x, int (*fn)(int)) { return fn(x); }
int doubler(int n) { return n * 2; }
int main() {
std::cout << apply(10, doubler) << '\n';
return 0;
}Scegliere a runtime
Poiché un puntatore a funzione è una variabile, è possibile decidere quale funzione chiamare mentre il programma è in esecuzione.
#include <iostream>
int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }
int main() {
bool wantAdd = true;
int (*op)(int, int) = wantAdd ? add : sub;
std::cout << op(8, 3) << '\n';
return 0;
}Array di puntatori a funzione
Memorizzi diversi puntatori a funzione in un array per creare una semplice tabella di dispatch indicizzata da un valore.
#include <iostream>
int add(int a, int b) { return a + b; }
int mul(int a, int b) { return a * b; }
int main() {
int (*ops[2])(int, int) = {add, mul};
std::cout << ops[0](2, 3) << ' ' << ops[1](2, 3) << '\n';
return 0;
}Usare un typedef
La sintassi dei puntatori è poco leggibile. Un alias typedef o using assegna al tipo un nome più chiaro.
#include <iostream>
using BinOp = int(*)(int, int);
int add(int a, int b) { return a + b; }
int main() {
BinOp op = add;
std::cout << op(6, 7) << '\n';
return 0;
}Puntatori a funzione con gli algoritmi
Gli algoritmi standard accettano oggetti chiamabili e una semplice funzione può essere usata come tale. Qui un predicato conta i numeri pari.
#include <iostream>
#include <vector>
#include <algorithm>
bool isEven(int n) { return n % 2 == 0; }
int main() {
std::vector<int> v = {1, 2, 3, 4, 5, 6};
int c = std::count_if(v.begin(), v.end(), isEven);
std::cout << "Evens: " << c << '\n';
return 0;
}Limite: nessuno stato
Un semplice puntatore a funzione non può contenere dati catturati. Se ha bisogno di conservare il contesto tra una chiamata e l'altra, deve usare variabili globali o passare a oggetti chiamabili più ricchi.
#include <iostream>
int counter = 0;
int next() { return ++counter; }
int main() {
int (*fn)() = next;
std::cout << fn() << ' ' << fn() << ' ' << fn() << '\n';
return 0;
}Conversione delle lambda senza catture
Una lambda che non cattura nulla può convertirsi implicitamente in un puntatore a funzione compatibile, una soluzione pratica per piccole funzioni inline.
#include <iostream>
int main() {
int (*fn)(int) = [](int x) { return x + 100; };
std::cout << fn(1) << '\n';
return 0;
}Puntatori a funzione null
Un puntatore a funzione può essere nullptr, cioè non puntare a nulla. Lo controlli sempre prima di chiamarlo, per evitare un comportamento indefinito.
#include <iostream>
int main() {
int (*fn)(int) = nullptr;
if (fn) {
std::cout << fn(5) << '\n';
} else {
std::cout << "No function set\n";
}
return 0;
}Verifica rapida
Verifichi la Sua comprensione dei limiti dei puntatori a funzione.
Riepilogo
Ha imparato a conoscere i puntatori a funzione:
- contengono l'indirizzo di una funzione e vengono chiamati come la funzione
- permettono di passare un comportamento come parametro e di creare tabelle di dispatch
- gli alias rendono il tipo più leggibile
- non possono contenere stato, ma le lambda senza catture possono convertirsi in essi
Ora conoscerà std::function, che può memorizzare qualsiasi oggetto chiamabile, inclusi quelli con stato.
Domande Frequenti
La lezione «Puntatori a funzione» è gratuita?
Sì — il testo completo di «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 «Puntatori a funzione»?
Passare funzioni come argomenti 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 «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
- Puntatori a funzione
- std::function
- std::bind
- Scegliere i callable