Menu
Coddy logo textTech

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

Dieselbe 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.

challenge icon

Aufgabe

Einfach

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

  1. Zwei Funktionen definiert:
    • add — nimmt zwei int-Parameter entgegen und gibt deren Summe zurück
    • subtract — nimmt zwei int-Parameter entgegen und gibt das Ergebnis der Subtraktion des zweiten vom ersten zurück
  2. In main einen Funktionspointer namens calc deklariert, der auf Funktionen zeigen kann, die zwei int-Parameter entgegennehmen und einen int zurückgeben
  3. Vier Eingaben liest: zwei Ganzzahlen und zwei Operationscodes
  4. Für jeden Operationscode:
    • Die entsprechende Funktion calc zuweist (1 für add, 2 für subtract)
    • Die Funktion über den Pointer mit den beiden Zahlen aufruft
    • Das Ergebnis ausgibt

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
5

In 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: 2

Dies 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;
}
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