Zeiger als Parameter
Bisher lagen der Zeiger und seine Variable beide in main, und du hättest die Variable auch direkt ändern können. Jetzt kommt der Hauptgrund, warum es Zeiger gibt. Erinnere dich an die Lektion über Funktionen: Ein Parameter ist eine Kopie des Arguments. Wenn eine Funktion ihren Parameter ändert, bleibt die Variable des Aufrufers gleich:
#include <stdio.h>
void bonus_addieren(int punkte, int bonus) {
punkte += bonus;
}
int main(void) {
int punktestand = 10;
bonus_addieren(punktestand, 5);
printf("Punktestand: %d\n", punktestand);
return 0;
}Das gibt aus:
Punktestand: 10Die Funktion hat die Zahl 10 bekommen, nicht die Variable punktestand. Es ist, als würdest du jemandem eine Fotokopie deiner Klassenarbeit geben: Was auch immer er auf die Kopie schreibt, dein Original bleibt, wie es war.
Die Lösung: Gib der Funktion die Adresse der Variablen. Mit der Adresse kann die Funktion das Kästchen des Aufrufers erreichen und ändern, was darin liegt:
#include <stdio.h>
void bonus_addieren(int *punkte, int bonus) {
*punkte += bonus;
}
int main(void) {
int punktestand = 10;
bonus_addieren(&punktestand, 5);
bonus_addieren(&punktestand, 3);
printf("Punktestand: %d\n", punktestand);
return 0;
}Das gibt aus:
Punktestand: 18Drei Dinge haben sich geändert: Der Parameter ist ein Zeiger, int *punkte; in der Funktion ist *punkte die Variable des Aufrufers; und der Aufruf übergibt eine Adresse, &punktestand. Die Adresse wird auch in den Parameter kopiert, aber eine Kopie einer Adresse führt trotzdem zum selben Kästchen. Es ist, als würdest du jemandem deine Wohnadresse auf einem Zettel geben: Mit einer Kopie des Zettels findet er trotzdem dasselbe Haus.
In C ist das der übliche Weg, wie eine Funktion Variablen ihres Aufrufers ändert. Es gibt noch einen Vorteil: Schon der Aufruf zeigt, dass die Funktion punktestand ändern darf, denn du siehst das &. Der Parameter bonus bleibt ein gewöhnlicher int, weil die Funktion ihn nur liest.
Häufige Fehler:
- Ein Aufruf ohne
&,bonus_addieren(punktestand, 5);, endet mit dem Fehlerincompatible integer to pointer conversion passing 'int' to parameter of type 'int *'; take the address with &. Der Compiler sagt dir, was du tun sollst: die Adresse mit&nehmen. - Wenn du in der Funktion den Stern vergisst und
punkte += bonus;schreibst, lässt sich das Programm ohne Fehler kompilieren, aber es ändert die Kopie der Adresse, den Zeiger selbst, und nicht den Punktestand.punktestandbleibt 10. Wenn eine Funktion „nichts tut“, prüfe zuerst die Sterne.
So schreibst du es:
Anweisungen
- 1
Die Funktion
gold_addierensoll Gold addieren, aber das Programm gibtGold: 80, Leben: 3aus, weil die Funktion nur ihre Kopie ändert. Ändere sie so, dass siegoldinmainändert: Mache ihren ersten Parameter zu einem Zeigerint *gold, setze in der Funktion den Stern und übergib im Aufruf die Adresse&gold. Das Programm gibt dannGold: 130, Leben: 3aus. - 2
Im Spiel kostet ein Leben 100 Gold. Schreibe unter
gold_addiereneine Funktionleben_kaufenmit zwei Parametern vom Typint *:goldundleben. Über die Zeiger zieht sie 100 Gold ab und addiert ein Leben. Rufe sie am Ende vonmain(vorreturn 0;) mit den Adressen beider Variablen auf und gib dann die Zeile mit dem Gold und den Leben noch einmal auf dieselbe Weise aus. Das Programm gibtGold: 130, Leben: 3und dannGold: 30, Leben: 4aus. - 3
Ein Leben kann man nur mit mindestens 100 Gold kaufen. Füge
leben_kaufeneine Bedingung hinzu: Wenn weniger als 100 Gold da sind, ändert die Funktion nichts und gibtNicht genug Goldaus. Rufe dannleben_kaufennoch einmal auf und gib die Zeile mit dem Gold und den Leben noch einmal aus. Die letzten drei Zeilen der Ausgabe sindGold: 30, Leben: 4,Nicht genug GoldundGold: 30, Leben: 4.