Funktionszeiger deklarieren
Teil des Abschnitts Objektorientierte Programmierung der C-Journey von Coddy. Lektion 33 von 61.
Bisher haben wir gelernt, Vererbung mithilfe der Einbettung von Strukturen zu simulieren. Doch 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. So wie ein regulärer Zeiger die Adresse von Daten enthält, enthält ein Funktionszeiger die Adresse von ausführbarem Code.
Die Syntax kann auf den ersten Blick einschüchternd wirken. Um einen Funktionszeiger zu deklarieren, gibst du 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 verweisen kann, die zwei int-Parameter übernimmt und einen int zurückgibt. Die Klammern um *operation sind entscheidend; ohne sie würdest du eine Funktion deklarieren, die einen Zeiger zurückgibt.
Um diesem Zeiger eine Funktion zuzuweisen, verwende 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 dient als ihre Adresse. Du kannst auch explizit &add verwenden, aber das ist optional: Beide Formen sind in C gleichwertig.
Aufgabe
EinfachÜben wir das Deklarieren von Funktionszeigern und das Zuweisen von Funktionen zu ihnen. Du erstellst ein einfaches System für mathematische Operationen, in dem ein Funktionszeiger verschiedene arithmetische Funktionen enthalten kann.
Schreibe ein Programm, das:
- Zwei Funktionen definiert:
multiply: nimmt zweiint-Parameter entgegen und gibt ihr Produkt zurücksubtract: nimmt zweiint-Parameter entgegen und gibt die Differenz aus der ersten minus der zweiten Zahl zurück
- in
maineine Funktionszeigervariable namensoperationdeklariert, die auf Funktionen zeigen kann, die zweiint-Parameter entgegennehmen und einenintzurückgeben - drei Eingaben einliest: zwei Ganzzahlen und einen Operationscode (1 für multiply, 2 für subtract)
- abhängig vom Operationscode die passende Funktion deinem Zeiger
operationzuweist - den Namen der zugewiesenen Operation ausgibt und anschließend das Ergebnis des Aufrufs der Funktion über den Zeiger ausgibt
Du erhältst drei Eingaben: die erste Zahl, die zweite Zahl und den Operationscode (1 oder 2).
Deine Ausgabe sollte so aussehen:
Operation: multiply
Result: 35Dabei ist multiply der Name der Operation (oder subtract, wenn der Code 2 ist), und 35 das Ergebnis des Aufrufs der Funktion über deinen Zeiger (in diesem Fall 5 × 7).
Denke daran: Um den Funktionszeiger zu deklarieren, benötigst du den Rückgabetyp, den Zeigernamen in Klammern mit einem Sternchen sowie die Parametertypen. Um eine Funktion zuzuweisen, verwende nur den Funktionsnamen ohne Klammern.
Probier es selbst
#include <stdio.h>
// TODO: Definiere die multiply-Funktion hier
// TODO: Definiere die subtract-Funktion hier
int main() {
int num1, num2, code;
// Eingabe lesen
scanf("%d", &num1);
scanf("%d", &num2);
scanf("%d", &code);
// TODO: Deklariere einen Funktionszeiger namens 'operation', der auf
// Funktionen zeigen kann, die zwei int-Parameter nehmen und ein int zurückgeben
// TODO: Basierend auf dem Operationscode (1 für multiply, 2 für subtract),
// weise die entsprechende Funktion deinem operation-Zeiger zu
// TODO: Gib 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 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