0Pricing
C Academy · Lezione

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; typedef migliora 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

  1. Dichiarare puntatori a funzione
  2. Passare funzioni
  3. qsort con comparatori
  4. Tabelle di puntatori a funzione
← Torna a C Academy