Funktionszeiger aufrufen
Teil des Abschnitts Object Oriented Programming der C-Journey von Coddy — Lektion 34 von 61.
Nachdem Sie nun wissen, 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 — Sie verwenden den Funktionszeiger genau so, wie Sie eine reguläre Funktion aufrufen würden:
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;
}Schreiben Sie einfach den Namen des Pointers, gefolgt von Klammern, die die Argumente enthalten. C dereferenziert den Pointer automatisch und führt die Funktion aus, auf die er zeigt.
Sie können auch die explizite Dereferenzierungssyntax mit (*operation)(5, 3) verwenden, aber dies ist optional und weniger gebräuchlich. Beide Formen führen zu identischen Ergebnissen.
Die wahre Stärke zeigt sich, wenn Sie den Zeiger auf verschiedene Funktionen neu zuweisen:
int subtract(int a, int b) {
return a - b;
}
operation = subtract;
result = operation(5, 3); // Ruft nun subtract(5, 3) auf
printf("%d\n", result); // Ausgabe: 2Dieselbe Variable operation führt nun eine völlig andere Logik aus. Diese Fähigkeit, das Verhalten zur Laufzeit auszutauschen, ist die Grundlage der Polymorphie in C.
Aufgabe
EinfachLassen Sie uns das Aufrufen von Funktionen über Pointer und das Wechseln der auszuführenden Funktion üben. Sie werden einen einfachen Taschenrechner erstellen, der zur Laufzeit zwischen Addition und Subtraktion umschalten kann.
Schreiben Sie ein Programm, das:
- Zwei Funktionen definiert:
add— nimmt zweiint-Parameter entgegen und gibt deren Summe zurücksubtract— nimmt zweiint-Parameter entgegen und gibt das Ergebnis der Subtraktion des zweiten vom ersten zurück
- In
maineinen Funktionspointer namenscalcdeklariert, der auf Funktionen zeigen kann, die zweiint-Parameter entgegennehmen und einenintzurückgeben - Vier Eingaben liest: zwei Ganzzahlen und zwei Operationscodes
- Für jeden Operationscode:
- Die entsprechende Funktion
calczuweist (1 für add, 2 für subtract) - Die Funktion über den Pointer mit den beiden Zahlen aufruft
- Das Ergebnis ausgibt
- Die entsprechende Funktion
Sie erhalten vier Eingaben: die erste Zahl, die zweite Zahl, den ersten Operationscode (1 oder 2) und den zweiten Operationscode (1 oder 2).
Ihre Ausgabe sollte zwei Ergebnisse in separaten Zeilen anzeigen – eines für jede Operation, die mit denselben zwei Zahlen durchgeführt wurde:
15
5In diesem Beispiel mit den Eingaben 10, 5, 1, 2: Die erste Operation (Code 1) addiert 10 + 5 = 15, dann wird der Pointer neu zugewiesen, und die zweite Operation (Code 2) subtrahiert 10 - 5 = 5.
Dies demonstriert, wie dieselbe Pointer-Variable durch Neuzuweisung zwischen den Aufrufen völlig unterschiedliche Logik ausführen kann.
Spickzettel
Um eine Funktion über einen Zeiger aufzurufen, verwenden Sie den Zeigernamen gefolgt von Klammern mit Argumenten:
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;
}Sie können auch die explizite Dereferenzierungssyntax (*operation)(5, 3) verwenden, aber dies ist optional.
Funktionszeiger können zur Laufzeit neu zugewiesen werden, um auf verschiedene Funktionen zu zeigen:
int subtract(int a, int b) {
return a - b;
}
operation = subtract;
result = operation(5, 3); // Ruft nun subtract(5, 3) auf
printf("%d\n", result); // Ausgabe: 2Dies ermöglicht es derselben Zeigervariablen, durch Neuzuweisung zwischen den Aufrufen unterschiedliche Logik auszuführen.
Probier es selbst
#include <stdio.h>
// TODO: Definieren Sie hier die Additionsfunktion (add)
// TODO: Definieren Sie hier die Subtraktionsfunktion (subtract)
int main() {
// Eingaben lesen
int num1, num2, op1, op2;
scanf("%d", &num1);
scanf("%d", &num2);
scanf("%d", &op1);
scanf("%d", &op2);
// TODO: Deklarieren Sie einen Funktionszeiger namens 'calc', der auf
// Funktionen zeigen kann, die zwei int-Parameter annehmen und ein int zurückgeben
// TODO: Für den ersten Operationscode (op1):
// - Weisen Sie calc die entsprechende Funktion zu (1 für add, 2 für subtract)
// - Rufen Sie die Funktion über den Zeiger auf und geben Sie das Ergebnis aus
// TODO: Für den zweiten Operationscode (op2):
// - Weisen Sie calc die entsprechende Funktion neu zu
// - Rufen Sie die Funktion über den Zeiger auf und geben Sie 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 Object Oriented Programming
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-Implementierung