Menu
Coddy logo textTech

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 add

Der Funktionsname fungiert als seine Adresse. Sie können auch &add explizit verwenden, aber es ist optional – beide Formen sind in C gleichwertig.

challenge icon

Aufgabe

Einfach

Lassen 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:

  1. Zwei Funktionen definiert:
    • multiply — nimmt zwei int-Parameter entgegen und gibt deren Produkt zurück
    • subtract — nimmt zwei int-Parameter entgegen und gibt den ersten minus den zweiten zurück
  2. In main eine Funktionszeigervariable namens operation deklariert, die auf Funktionen zeigen kann, die zwei int-Parameter entgegennehmen und ein int zurückgeben
  3. Drei Eingaben liest: zwei Ganzzahlen und einen Operationscode (1 für multiply, 2 für subtract)
  4. Basierend auf dem Operationscode dem operation-Zeiger die entsprechende Funktion zuweist
  5. 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: 35

Wobei 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 add

Der 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;
}
quiz iconTeste dich selbst

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