Menu
Coddy logo textTech

Ein klassisches Beispiel: Swap

Teil des Abschnitts Logic & Flow der C-Journey von Coddy — Lektion 28 von 63.

Die swap-Funktion ist eines der bekanntesten Beispiele, das zeigt, warum Pointer in der C-Programmierung unerlässlich sind. Das Ziel ist einfach: Schreiben Sie eine Funktion, die die Werte zweier Variablen vertauscht. Diese scheinbar einfache Aufgabe offenbart jedoch eine grundlegende Einschränkung von Pass-by-Value.

Überlegen Sie, was passiert, wenn Sie versuchen, zwei Variablen mit regulärem Pass-by-Value zu vertauschen:

void badSwap(int a, int b) {
    int temp = a;
    a = b;
    b = temp;
    // Dies vertauscht nur die Kopien, nicht die ursprünglichen Variablen!
}

Dieser Ansatz schlägt fehl, da die Funktion nur Kopien der Werte erhält. Die ursprünglichen Variablen in der aufrufenden Funktion bleiben unverändert.

Die Lösung erfordert stattdessen die Übergabe von Pointern auf die Variablen:

void swap(int *a, int *b) {
    int temp = *a;  // Speichere den Wert an Adresse a
    *a = *b;        // Schreibe den Wert von Adresse b an Adresse a
    *b = temp;      // Schreibe den gespeicherten Wert an Adresse b
}

Durch die Übergabe der Adressen der Variablen und die Verwendung des Dereferenzierungsoperators kann die Funktion die Werte der ursprünglichen Variablen direkt ändern. Dies macht die swap-Funktion zu einer perfekten Demonstration dafür, wann und warum man Pointer benötigt, um Aufgaben zu bewältigen, die mit pass-by-value einfach nicht möglich sind.

challenge icon

Aufgabe

Einfach

Schreiben Sie ein C-Programm, das die klassische swap-Funktion unter Verwendung von Pointern implementiert und demonstriert. Ihr Programm sollte:

  1. Erstellen Sie eine Funktion namens swap, die zwei Pointer auf Integer als Parameter entgegennimmt
  2. Tauschen Sie innerhalb der swap-Funktion die Werte an den Speicheradressen, auf die die beiden Pointer zeigen, mithilfe einer temporären Variable aus
  3. Lesen Sie in der main-Funktion zwei Integer von der Benutzereingabe ein
  4. Geben Sie die ursprünglichen Werte im Format Before swap: a = [value], b = [value] aus
  5. Rufen Sie die swap-Funktion auf und übergeben Sie die Adressen beider Variablen mithilfe des Adressoperators
  6. Geben Sie nach dem Funktionsaufruf die vertauschten Werte im Format After swap: a = [value], b = [value] aus

Ihre Ausgabe sollte zeigen, dass die Funktion die Werte der ursprünglichen Variablen erfolgreich vertauscht:

Before swap: a = [first_input], b = [second_input]
After swap: a = [second_input], b = [first_input]

Diese Herausforderung zeigt, warum Pointer für die swap-Operation unerlässlich sind – die Funktion muss auf die Speicherorte der ursprünglichen Variablen zugreifen, um deren Werte dauerhaft zu vertauschen, was mit pass-by-value unmöglich ist.

Spickzettel

Die swap-Funktion zeigt, warum Pointer in C essenziell sind. Pass-by-Value kann die ursprünglichen Variablen nicht vertauschen, da Funktionen nur Kopien erhalten:

void badSwap(int a, int b) {
    int temp = a;
    a = b;
    b = temp;
    // Dies vertauscht nur die Kopien, nicht die ursprünglichen Variablen!
}

Der richtige Ansatz verwendet Pointer, um auf die ursprünglichen Variablen zuzugreifen und diese zu ändern:

void swap(int *a, int *b) {
    int temp = *a;  // Speichere den Wert an Adresse a
    *a = *b;        // Schreibe den Wert von Adresse b an Adresse a
    *b = temp;      // Schreibe den gespeicherten Wert an Adresse b
}

Durch das Übergeben von Adressen und die Verwendung des Dereferenzierungsoperators (*) kann die Funktion die Werte der ursprünglichen Variablen direkt ändern.

Probier es selbst

#include <stdio.h>

// TODO: Schreiben Sie hier Ihre Swap-Funktion

int main() {
    int a, b;
    
    // Eingabe lesen
    scanf("%d", &a);
    scanf("%d", &b);
    
    // Ursprüngliche Werte ausgeben
    printf("Before swap: a = %d, b = %d\n", a, b);
    
    // TODO: Rufen Sie hier Ihre Swap-Funktion auf
    
    // Vertauschte Werte ausgeben
    printf("After swap: a = %d, b = %d\n", a, b);
    
    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 Logic & Flow