Ein klassisches Beispiel: Swap
Teil des Abschnitts Logik & Ablauf der C-Journey von Coddy. Lektion 28 von 63.
Die swap-Funktion ist eines der bekanntesten Beispiele dafür, warum Zeiger in der C-Programmierung unverzichtbar sind. Das Ziel ist einfach: Schreibe eine Funktion, die die Werte zweier Variablen vertauscht. Diese scheinbar unkomplizierte Aufgabe offenbart jedoch eine grundlegende Einschränkung der Übergabe per Wert.
Ü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
}Indem die Adressen der Variablen übergeben und der Dereferenzierungsoperator verwendet wird, kann die Funktion die Werte der ursprünglichen Variablen direkt ändern. Dadurch ist die Swap-Funktion ein perfektes Beispiel dafür, wann und warum du Zeiger benötigst, um Aufgaben zu bewältigen, die die Wertübergabe allein nicht erledigen kann.
Aufgabe
EinfachSchreibe ein C-Programm, das die klassische Tauschfunktion mithilfe von Zeigern implementiert und demonstriert. Dein Programm sollte:
- Eine Funktion namens
swaperstellen, die zwei Zeiger auf Ganzzahlen als Parameter entgegennimmt - Innerhalb der Funktion
swapdie Werte an den Speicheradressen, auf die die beiden Zeiger zeigen, mithilfe einer temporären Variable austauschen - In der Funktion
mainzwei Ganzzahlen aus der Benutzereingabe einlesen - Die ursprünglichen Werte im folgenden Format ausgeben:
Before swap: a = [value], b = [value] - Die Funktion
swapaufrufen und die Adressen beider Variablen mithilfe des Adressoperators übergeben - Nach dem Funktionsaufruf die vertauschten Werte im folgenden Format ausgeben:
After swap: a = [value], b = [value]
Deine Ausgabe sollte zeigen, dass die Funktion die Werte der ursprünglichen Variablen erfolgreich austauscht:
Before swap: a = [first_input], b = [second_input]
After swap: a = [second_input], b = [first_input]Diese Herausforderung zeigt, warum Zeiger für den Tauschvorgang unerlässlich sind – die Funktion muss auf die Speicherstellen der ursprünglichen Variablen zugreifen, um ihre Werte dauerhaft auszutauschen, was bei der Übergabe per Wert unmöglich ist.
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;
}Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik & Ablauf
1Zeiger-Grundlagen
Was ist ein Zeiger?Zeiger deklarierenDer Adressoperator (&)Der Dereferenzierungsoperator (*)NULL-ZeigerZusammenfassung: Zeiger-Grundlagen4Projekt: Einfaches Text-Tool
ProjektübersichtZeichen zählen2Pointer und Arrays
Array-Namen als PointerArray-Elemente - PointerPointer-ArithmetikPointer vergleichenWiederholung: Array-Durchlauf mit Pointern5Zeiger und Funktionen
Wertübergabe (Pass-by-Value)Zeiger an Funktionen übergebenVariablen über Zeiger ändernEin klassisches Beispiel: SwapArrays an Funktionen übergebenZusammenfassung: Zeiger als Funktionsargumente8Structs und Zeiger
Zeiger auf StructsDer Pfeiloperator (->)Structs per Wert übergebenÜbergabe von Struct-ZeigernDynamische Allokation von StructsZusammenfassung: Struct ändern - Ptr11Finale Wiederholungsaufgaben
Wiederholung: Dynamische String-KonkatenationWiederholung: Array von StructsWiederholung: Wortfrequenz-Zähler3Character-Arrays und Strings
Strings als char-ArraysDer Null-TerminatorString-Eingabe mit scanfVerwendung von strlen()Verwendung von strcpy()Verwendung von strcat()Verwendung von strcmp()Zusammenfassung: Grundlegende String-FunktionenÜbe selbstständig: Online-C-Compiler