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.
Aufgabe
EinfachSchreiben Sie ein C-Programm, das die klassische swap-Funktion unter Verwendung von Pointern implementiert und demonstriert. Ihr Programm sollte:
- Erstellen Sie eine Funktion namens
swap, die zwei Pointer auf Integer als Parameter entgegennimmt - Tauschen Sie innerhalb der
swap-Funktion die Werte an den Speicheradressen, auf die die beiden Pointer zeigen, mithilfe einer temporären Variable aus - Lesen Sie in der
main-Funktion zwei Integer von der Benutzereingabe ein - Geben Sie die ursprünglichen Werte im Format
Before swap: a = [value], b = [value]aus - Rufen Sie die
swap-Funktion auf und übergeben Sie die Adressen beider Variablen mithilfe des Adressoperators - 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;
}Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logic & Flow
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