Zwei Variablen tauschen
Die Werte zweier Variablen zu tauschen ist eine häufige Aufgabe beim Programmieren, zum Beispiel beim Sortieren. In main, ohne Funktion, sieht es auf den ersten Blick einfach aus:
int a = 3;
int b = 8;
a = b;
b = a;
printf("%d %d\n", a, b);Das gibt aus:
8 8Die Zeile a = b; hat den ursprünglichen Wert von a, die 3, überschrieben, und sie ging verloren. Es ist, als wolltest du die Getränke in zwei vollen Gläsern tauschen: Du brauchst ein drittes, leeres Glas. In einem Programm ist dieses Glas eine Hilfsvariable, in der du zuerst den ursprünglichen Wert von a speicherst:
int a = 3;
int b = 8;
int zwischen = a;
a = b;
b = zwischen;
printf("%d %d\n", a, b);Das gibt aus:
8 3Eine Funktion tausche muss zwei Variablen ihres Aufrufers ändern, also müssen beide Parameter Zeiger sein: void tausche(int *a, int *b). Innen macht sie dieselben drei Schritte wie oben, nur mit *a und *b statt a und b. Die Hilfsvariable zwischen bleibt ein gewöhnlicher int, weil sie einen Wert enthält, keine Adresse. Der Aufruf übergibt zwei Adressen: tausche(&x, &y);.
Achte auf diese Fehler:
- Wenn du die Sterne vergisst (
int *zwischen = a; a = b; b = zwischen;), tauscht die Funktion die beiden Zeiger, ihre eigenen Kopien der Adressen. Das Programm lässt sich kompilieren und läuft, aber die Variablen inmainbleiben, wie sie waren. - Eine Funktion, die schon Zeiger hat, gibt sie ohne
&weiter. In einer Funktion mit den Parameternint *aundint *brufst dutausche(a, b)auf, dennaundbsind schon Adressen.tausche(&a, &b)endet mit dem Fehlerincompatible pointer types passing 'int **' to parameter of type 'int *'; remove &.int **ist die Adresse eines Zeigers, die du hier nicht brauchst, und die Meldung sagt dir, was zu tun ist: das&entfernen („remove &“).
So schreibst du es:
Anweisungen
- 1
Schreibe anstelle des ersten Kommentars eine Funktion
tauschemit zwei Parametern vom Typint *,aundb, die die Werte vertauscht, auf die sie zeigen. - 2
Rufe in
mainanstelle des Kommentars zwischen den ersten beidenprintf-Zeilentauschemit den Adressen vonersteundzweiteauf. Das Programm gibt3 8und dann8 3aus. - 3
Schreibe anstelle des zweiten Kommentars eine Funktion
paar_sortieren, die ebenfalls zwei Zeiger aufintbekommt. Wenn der erste auf eine größere Zahl zeigt als der zweite, ruft sietauscheauf, um sie zu vertauschen, sodass die kleinere Zahl immer zuerst kommt. Rufe dann anstelle des letzten Kommentarspaar_sortierenmit den Adressen vonxundyauf. Die letzte Zeile der Ausgabe ist dann4 9.