Funktionszeiger aufrufen
Teil des Abschnitts Objektorientierte Programmierung der C-Journey von Coddy. Lektion 34 von 61.
Jetzt, da du weißt, wie man einen Funktionszeiger deklariert und ihm eine Funktion zuweist, besteht der nächste Schritt darin, die Funktion tatsächlich über diesen Zeiger aufzurufen.
Die Syntax ist unkompliziert. Du verwendest den Funktionszeiger genau so, wie du eine gewöhnliche Funktion aufrufen würdest:
int add(int a, int b) {
return a + b;
}
int main() {
int (*operation)(int, int) = add;
int result = operation(5, 3); // Ruft add(5, 3) auf
printf("%d\n", result); // Ausgabe: 8
return 0;
}Schreibe einfach den Namen des Zeigers, gefolgt von Klammern mit den Argumenten. C dereferenziert den Zeiger automatisch und führt die Funktion aus, auf die er zeigt.
Du kannst auch die explizite Dereferenzierungssyntax mit (*operation)(5, 3) verwenden, aber sie ist optional und weniger üblich. Beide Formen erzeugen identische Ergebnisse.
Die eigentliche Stärke zeigt sich, wenn du den pointer verschiedenen Funktionen neu zuweist:
int subtract(int a, int b) {
return a - b;
}
operation = subtract;
result = operation(5, 3); // Ruft jetzt subtract(5, 3) auf
printf("%d\n", result); // Ausgabe: 2Dieselbe Variable operation führt nun eine völlig andere Logik aus. Diese Möglichkeit, das Verhalten zur Laufzeit auszutauschen, bildet die Grundlage des Polymorphismus in C.
Aufgabe
EinfachÜbe, Funktionen über Zeiger aufzurufen und zu ändern, welche Funktion ausgeführt wird. Du erstellst einen einfachen Taschenrechner, der zur Laufzeit zwischen Addition und Subtraktion wechseln kann.
Schreibe ein Programm, das:
- Zwei Funktionen definiert:
add: nimmt zweiint-Parameter entgegen und gibt deren Summe zurücksubtract: nimmt zweiint-Parameter entgegen und gibt die Differenz aus dem ersten minus dem zweiten zurück
- in
maineinen Funktionszeiger namenscalcdeklariert, der auf Funktionen zeigen kann, die zweiint-Parameter entgegennehmen und einenintzurückgeben - vier Eingaben einliest: zwei Ganzzahlen und zwei Operationscodes
- für jeden Operationscode:
- die passende Funktion
calczuweist (1 für add, 2 für subtract) - die Funktion über den Zeiger mit den beiden Zahlen aufruft
- das Ergebnis ausgibt
- die passende Funktion
Du erhältst vier Eingaben: die erste Zahl, die zweite Zahl, den ersten Operationscode (1 oder 2) und den zweiten Operationscode (1 oder 2).
Deine Ausgabe sollte zwei Ergebnisse in separaten Zeilen anzeigen: eines für jede mit denselben beiden Zahlen ausgeführte Operation:
15
5In diesem Beispiel addiert die erste Operation (Code 1) bei den Eingaben 10, 5, 1, 2: 10 + 5 = 15. Anschließend wird der Zeiger neu zugewiesen, und die zweite Operation (Code 2) subtrahiert 10 - 5 = 5.
Dies zeigt, wie dieselbe Zeigervariable durch eine Neuzuweisung zwischen den Aufrufen völlig unterschiedliche Logik ausführen kann.
Probier es selbst
#include <stdio.h>
// TODO: Definiere die add-Funktion hier
// TODO: Definiere die subtract-Funktion hier
int main() {
// Eingaben lesen
int num1, num2, op1, op2;
scanf("%d", &num1);
scanf("%d", &num2);
scanf("%d", &op1);
scanf("%d", &op2);
// TODO: Deklariere einen Funktionszeiger namens 'calc', der auf
// Funktionen zeigen kann, die zwei int-Parameter nehmen und ein int zurückgeben
// TODO: Für den ersten Operationscode (op1):
// - Weise calc die passende Funktion zu (1 für add, 2 für subtract)
// - Rufe die Funktion über den Zeiger auf und gib das Ergebnis aus
// TODO: Für den zweiten Operationscode (op2):
// - Weise calc erneut die passende Funktion zu
// - Rufe die Funktion über den Zeiger auf und gib das Ergebnis aus
return 0;
}Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der modularen Programmierung
Header-DateienInclude GuardsQuelldateienStatische FunktionenWiederholung: Modularer Taschenrechner4Kapselung
Konzept der Opaque PointersOpaque Structs definierenGetter und SetterValidierung in SetternRückblick: Die geheime Box7Funktionszeiger
Funktionszeiger deklarierenFunktionszeiger aufrufenTypedef für FunktionszeigerFunktionen als Argumente übergebenZusammenfassung: Calculator Dispatch2Objekte und Methoden
Structs als ObjekteDer 'Self'-PointerConst-CorrectnessPointer vs. WertHilfsmethodenZusammenfassung: Point Manager5Projekt: Einfaches Bankkonto
Projekt-SetupImplementierung des Kontos3Objekt-Lebenszyklus
Konstruktor-MusterDestruktor-MusterStack-InitialisierungTiefe KopieRückblick: String-Wrapper6Vererbung durch Komposition
Struct-EinbettungDie First-Member-RegelZugriff auf Parent-MemberUpcastingRückblick: Formenhierarchie9Projekt: Formen-Zeichner
ProjektübersichtKreis-ImplementierungRechteck-ImplementierungPolymorphe VerwendungShape-ContainerÜbe selbstständig: Online-C-Compiler