Funktionszeiger deklarieren
Teil des Abschnitts Object Oriented Programming der C-Journey von Coddy — Lektion 33 von 61.
Bisher haben wir gelernt, Vererbung mittels Struct-Embedding zu simulieren. Aber echter Polymorphismus – bei dem verschiedene Objekte unterschiedlich auf denselben Aufruf reagieren – erfordert etwas mehr: Funktionszeiger.
Ein Funktionszeiger ist eine Variable, die die Adresse einer Funktion speichert. Genauso wie ein regulärer Zeiger die Adresse von Daten enthält, enthält ein Funktionszeiger die Adresse von ausführbarem Code.
Die Syntax kann anfangs einschüchternd wirken. Um einen Funktionszeiger zu deklarieren, geben Sie den Rückgabetyp an, dann den Zeigernamen in Klammern mit einem Sternchen, gefolgt von den Parametertypen:
int (*operation)(int, int);Dies deklariert eine Variable namens operation, die auf jede Funktion zeigen kann, die zwei int-Parameter entgegennimmt und einen int zurückgibt. Die Klammern um *operation sind entscheidend – ohne sie würden Sie eine Funktion deklarieren, die einen Pointer zurückgibt.
Um diesem Zeiger eine Funktion zuzuweisen, verwenden Sie einfach den Namen der Funktion (ohne Klammern):
int add(int a, int b) {
return a + b;
}
int (*operation)(int, int);
operation = add; // Jetzt zeigt operation auf addDer Funktionsname fungiert als seine Adresse. Sie können auch &add explizit verwenden, aber es ist optional – beide Formen sind in C gleichwertig.
Aufgabe
EinfachLassen Sie uns das Deklarieren von Funktionszeigern und das Zuweisen von Funktionen an diese üben. Sie werden ein einfaches mathematisches Operationssystem erstellen, bei dem ein Funktionszeiger verschiedene arithmetische Funktionen halten kann.
Schreiben Sie ein Programm, das:
- Zwei Funktionen definiert:
multiply— nimmt zweiint-Parameter entgegen und gibt deren Produkt zurücksubtract— nimmt zweiint-Parameter entgegen und gibt den ersten minus den zweiten zurück
- In
maineine Funktionszeigervariable namensoperationdeklariert, die auf Funktionen zeigen kann, die zweiint-Parameter entgegennehmen und einintzurückgeben - Drei Eingaben liest: zwei Ganzzahlen und einen Operationscode (1 für multiply, 2 für subtract)
- Basierend auf dem Operationscode dem
operation-Zeiger die entsprechende Funktion zuweist - Den Namen der zugewiesenen Operation ausgibt und anschließend das Ergebnis des Funktionsaufrufs über den Zeiger ausgibt
Sie erhalten drei Eingaben: die erste Zahl, die zweite Zahl und den Operationscode (1 oder 2).
Ihre Ausgabe sollte wie folgt aussehen:
Operation: multiply
Result: 35Wobei multiply der Name der Operation ist (oder subtract, wenn der Code 2 ist) und 35 das Ergebnis des Funktionsaufrufs über Ihren Zeiger ist (in diesem Fall 5 × 7).
Denken Sie daran: Um den Funktionszeiger zu deklarieren, benötigen Sie den Rückgabetyp, den Zeigernamen in Klammern mit einem Sternchen und die Parametertypen. Um eine Funktion zuzuweisen, verwenden Sie nur den Funktionsnamen ohne Klammern.
Spickzettel
Ein Funktionszeiger ist eine Variable, die die Adresse einer Funktion speichert und Polymorphismus ermöglicht, indem verschiedene Funktionen über denselben Zeiger aufgerufen werden können.
Deklaration eines Funktionszeigers
Die Syntax spezifiziert den Rückgabetyp, den Zeigernamen mit Sternchen in Klammern und die Parametertypen:
int (*operation)(int, int);Dies deklariert operation als einen Zeiger auf jede Funktion, die zwei int-Parameter entgegennimmt und einen int zurückgibt. Die Klammern um *operation sind essenziell.
Zuweisung einer Funktion zu einem Zeiger
Verwenden Sie den Funktionsnamen ohne Klammern:
int add(int a, int b) {
return a + b;
}
int (*operation)(int, int);
operation = add; // operation zeigt nun auf addDer Funktionsname fungiert als seine Adresse. Sie können auch explizit &add verwenden, aber dies ist optional.
Probier es selbst
#include <stdio.h>
// TODO: Definieren Sie hier die Multiplikationsfunktion
// TODO: Definieren Sie hier die Subtraktionsfunktion
int main() {
int num1, num2, code;
// Eingabe lesen
scanf("%d", &num1);
scanf("%d", &num2);
scanf("%d", &code);
// TODO: Deklarieren Sie einen Funktionszeiger namens 'operation', der auf
// Funktionen zeigen kann, die zwei int-Parameter annehmen und einen int zurückgeben
// TODO: Basierend auf dem Operationscode (1 für Multiplikation, 2 für Subtraktion),
// weisen Sie Ihrem Operationszeiger die entsprechende Funktion zu
// TODO: Geben Sie den Operationsnamen und das Ergebnis aus
// Format:
// Operation: <name>
// Result: <result>
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