0Pricing
C++ Academy · Lezione

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

  1. Puntatori a funzione
  2. std::function
  3. std::bind
  4. Scegliere i callable
← Torna a C++ Academy