Menu
Coddy logo textTech

Dichiarare puntatori a funzione

Fa parte della sezione Programmazione orientata agli oggetti del percorso C di Coddy. Lezione 33 di 61.

Finora abbiamo imparato a simulare l’ereditarietà usando l’incorporamento di struct. Ma il vero polimorfismo, in cui oggetti diversi rispondono in modo diverso alla stessa chiamata, richiede qualcosa in più: puntatori a funzione.

Un puntatore a funzione è una variabile che memorizza l'indirizzo di una funzione. Proprio come un normale puntatore contiene l'indirizzo di un dato, un puntatore a funzione contiene l'indirizzo di codice eseguibile.

La sintassi può sembrare intimidatoria all'inizio. Per dichiarare un puntatore a funzione, specifica il tipo restituito, poi il nome del puntatore tra parentesi con un asterisco, seguito dai tipi dei parametri:

int (*operation)(int, int);

Questo dichiara una variabile chiamata operation che può puntare a qualsiasi funzione che accetta due parametri int e restituisce un int. Le parentesi intorno a *operation sono fondamentali: senza di esse, dichiareresti una funzione che restituisce un puntatore.

Per assegnare una funzione a questo puntatore, usa semplicemente il nome della funzione (senza parentesi):

int add(int a, int b) {
    return a + b;
}

int (*operation)(int, int);
operation = add;  // Ora operation punta a add

Il nome della funzione funge da indirizzo. Puoi anche usare esplicitamente &add, ma è facoltativo: in C entrambe le forme sono equivalenti.

challenge icon

Sfida

Facile

Facciamo pratica con la dichiarazione di puntatori a funzione e l'assegnazione di funzioni a essi. Creerai un semplice sistema di operazioni matematiche in cui un puntatore a funzione può contenere diverse funzioni aritmetiche.

Scrivi un programma che:

  1. Definisce due funzioni:
    • multiply: accetta due parametri int e restituisce il loro prodotto
    • subtract: accetta due parametri int e restituisce il primo meno il secondo
  2. In main, dichiara una variabile puntatore a funzione chiamata operation che può puntare a funzioni che accettano due parametri int e restituiscono un int
  3. Legge tre input: due numeri interi e un codice operazione (1 per moltiplicare, 2 per sottrarre)
  4. In base al codice operazione, assegna la funzione appropriata al puntatore operation
  5. Stampa il nome dell'operazione assegnata, poi stampa il risultato della chiamata alla funzione tramite il puntatore

Riceverai tre input: il primo numero, il secondo numero e il codice operazione (1 o 2).

L'output dovrebbe apparire così:

Operation: multiply
Result: 35

Dove multiply è il nome dell'operazione (oppure subtract se il codice è 2) e 35 è il risultato della chiamata alla funzione tramite il puntatore (in questo caso, 5 × 7).

Ricorda: per dichiarare il puntatore a funzione, ti servono il tipo restituito, il nome del puntatore tra parentesi con un asterisco e i tipi dei parametri. Per assegnare una funzione, usa solo il nome della funzione senza parentesi.

Provalo tu

#include <stdio.h>

// TODO: Definisci qui la funzione multiply


// TODO: Definisci qui la funzione subtract


int main() {
    int num1, num2, code;
    
    // Leggi l'input
    scanf("%d", &num1);
    scanf("%d", &num2);
    scanf("%d", &code);
    
    // TODO: Dichiara un puntatore a funzione chiamato 'operation' che possa puntare a
    // funzioni che accettano due parametri int e restituiscono un int
    
    
    // TODO: In base al codice dell'operazione (1 per multiply, 2 per subtract),
    // assegna la funzione appropriata al puntatore operation
    
    
    // TODO: Stampa il nome dell'operazione e il risultato
    // Formato:
    // Operation: <name>
    // Result: <result>
    
    return 0;
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore C online