Chiamare i puntatori a funzione
Fa parte della sezione Programmazione orientata agli oggetti del percorso C di Coddy. Lezione 34 di 61.
Ora che sai come dichiarare un puntatore a funzione e assegnargli una funzione, il passo successivo è chiamare effettivamente la funzione tramite quel puntatore.
La sintassi è semplice. Usi il puntatore a funzione proprio come chiameresti una funzione normale:
int add(int a, int b) {
return a + b;
}
int main() {
int (*operation)(int, int) = add;
int result = operation(5, 3); // Chiama add(5, 3)
printf("%d\n", result); // Output: 8
return 0;
}Scrivi semplicemente il nome del puntatore seguito da parentesi contenenti gli argomenti. C dereferenzia automaticamente il puntatore ed esegue la funzione a cui punta.
Puoi anche usare la sintassi di dereferenziazione esplicita con (*operation)(5, 3), ma è facoltativa e meno comune. Entrambe le forme producono risultati identici.
La vera potenza emerge quando riassegni il puntatore a funzioni diverse:
int subtract(int a, int b) {
return a - b;
}
operation = subtract;
result = operation(5, 3); // Ora chiama subtract(5, 3)
printf("%d\n", result); // Output: 2La stessa variabile operation ora esegue una logica completamente diversa. Questa capacità di cambiare comportamento durante l’esecuzione è il fondamento del polimorfismo in C.
Sfida
FacileFacciamo pratica con la chiamata di funzioni tramite puntatori e con lo scambio della funzione eseguita. Costruirai una semplice calcolatrice che può passare dall’addizione alla sottrazione durante l’esecuzione.
Scrivi un programma che:
- Definisce due funzioni:
add: accetta due parametriinte restituisce la loro sommasubtract: accetta due parametriinte restituisce il primo meno il secondo
- In
main, dichiara un puntatore a funzione chiamatocalcche può puntare a funzioni che accettano due parametriinte restituiscono unint - Legge quattro input: due numeri interi e due codici operazione
- Per ciascun codice operazione:
- Assegna a
calcla funzione appropriata (1 per add, 2 per subtract) - Chiama la funzione tramite il puntatore, usando i due numeri
- Stampa il risultato
- Assegna a
Riceverai quattro input: il primo numero, il secondo numero, il primo codice operazione (1 o 2) e il secondo codice operazione (1 o 2).
L’output deve mostrare due risultati su righe separate: uno per ciascuna operazione eseguita usando gli stessi due numeri:
15
5In questo esempio, con gli input 10, 5, 1, 2: la prima operazione (codice 1) somma 10 + 5 = 15, poi il puntatore viene riassegnato e la seconda operazione (codice 2) sottrae 10 - 5 = 5.
Questo dimostra come la stessa variabile puntatore possa eseguire logiche completamente diverse riassegnandola tra una chiamata e l’altra.
Provalo tu
#include <stdio.h>
// TODO: Definisci qui la funzione add
// TODO: Definisci qui la funzione subtract
int main() {
// Leggi gli input
int num1, num2, op1, op2;
scanf("%d", &num1);
scanf("%d", &num2);
scanf("%d", &op1);
scanf("%d", &op2);
// TODO: Dichiara un puntatore a funzione chiamato 'calc' che possa puntare a
// funzioni che accettano due parametri int e restituiscono un int
// TODO: Per il primo codice operazione (op1):
// - Assegna a calc la funzione appropriata (1 per add, 2 per subtract)
// - Chiama la funzione tramite il puntatore e stampa il risultato
// TODO: Per il secondo codice operazione (op2):
// - Riassegna a calc la funzione appropriata
// - Chiama la funzione tramite il puntatore e stampa il risultato
return 0;
}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
1Basi di programmazione modulare
File di intestazioneGuardie di inclusioneFile sorgenteFunzioni staticheRipasso: calcolatrice modulare4Incapsulamento
Il concetto di puntatori opachiDefinire struct opacheGetter e setterLa convalida nei setterRiepilogo: scatola segreta7Puntatori a funzione
Dichiarare puntatori a funzioneChiamare i puntatori a funzioneTypedef per puntatori a funzionePassare funzioni come argomentiRiepilogo: dispatch della calcolatrice2Oggetti e metodi
Le struct come oggettiIl puntatore 'Self'Correttezza constPuntatore o valoreMetodi di supportoRiepilogo: gestore di punti5Progetto: Conto bancario semplice
Configurazione del progettoImplementazione del conto8Polimorfismo
Puntatori a funzione nelle structSimulare i metodiIl concetto di interfacciaImplementare le interfacceIterazione polimorficaRiepilogo: Greeter11Pattern di progettazione in C
Pattern SingletonPattern FactoryPattern IteratorRiepilogo: Factory di Logger3Ciclo di vita degli oggetti
Pattern del costruttorePattern del distruttoreInizializzazione sullo stackCopia profondaRiepilogo: wrapper di stringhe6Ereditarietà tramite composizione
Incorporamento delle structLa regola del primo membroAccesso ai membri della classe baseUpcastingRiepilogo: gerarchia di forme9Progetto: Disegnatore di forme
Panoramica del progettoImplementazione del cerchioImplementazione del rettangoloUtilizzo polimorficoContenitore di formeEsercitati da solo: Compilatore C online