Zeiger zum Lesen
Mit einem Zeigerparameter kann eine Funktion die Variablen des Aufrufers ändern. Das ist nützlich, aber auch ein Risiko: Eine Funktion, die ein Array nur lesen soll, könnte es aus Versehen ändern. Und wer die erste Zeile int summe(int *zahlen, int anzahl) liest, kann nicht erkennen, ob die Funktion das Array ändert oder nicht.
Das Schlüsselwort const löst beide Probleme. Du kennst es von Konstanten wie const double MWST_SATZ = 0.19;: ein Wert, der sich nicht ändern darf. Vor dem Typ eines Zeigers bedeutet es, dass die Werte über diesen Zeiger nicht geändert werden dürfen:
int summe(const int *zahlen, int anzahl) {
int gesamt = 0;
for (int i = 0; i < anzahl; i++) {
gesamt += zahlen[i];
}
return gesamt;
}Lies const int *zahlen als „zahlen zeigt auf Ganzzahlen, die es nur lesen darf“. Das Array, das du übergibst, muss nicht const sein: Das Versprechen gilt nur innerhalb der Funktion. Wenn die Funktion es trotzdem zu ändern versucht, zum Beispiel mit zahlen[0] = 0;, endet das Kompilieren mit dem Fehler read-only variable is not assignable. Schreibe also const, wann immer eine Funktion ein Array nur liest. Ihre erste Zeile sagt es dann, und der Compiler sorgt dafür, dass es stimmt.
Das hast du schon gesehen: Der Parameter const char text[] aus der Lektion über Funktionen ist dasselbe wie const char *text.
Bei Zeichenketten hat const noch einen weiteren Nutzen. Ein Zeiger kann auch auf Text in Anführungszeichen zeigen:
#include <stdio.h>
int main(void) {
char wort[] = "Hand";
wort[0] = 'L';
printf("%s\n", wort);
const char *tier = "Hund";
printf("%s\n", tier);
tier = "Fisch";
printf("%s\n", tier);
return 0;
}Das gibt aus:
Land
Hund
Fischchar wort[] = "Hand"; legt ein Array an und kopiert den Text hinein. Das Array gehört dir, also kannst du seine Buchstaben ändern. const char *tier = "Hund"; legt kein eigenes Array an: Der Zeiger zeigt nur auf den Text in Anführungszeichen, und dieser Text liegt in einem Teil des Speichers, den das Programm nicht ändern darf. Deshalb gehört const davor. Dann ist tier[0] = 'B'; ein Kompilierfehler (read-only variable is not assignable), aber du kannst tier auf anderen Text zeigen lassen: tier = "Fisch";. C erlaubt dir auch, char *tier = "Hund"; ohne const zu schreiben, aber den Text über einen solchen Zeiger zu ändern ist ein Fehler: Auf einem Computer stürzt das Programm meist ab.
So schreibst du es:
Anweisungen
- 1
Die Funktion
zaehle_bestandenliest das Array nur. Ändere ihren Parameter inconst int *punkte. Das Programm gibt weiterhinBestanden: 3aus. - 2
Die Funktion
zeige_titelliest den Text nur, und Text in Anführungszeichen darf ohnehin nicht geändert werden. Ändere ihren Parameter inconst char *titel. - 3
Schreibe unter
zaehle_bestandeneine Funktionhoechste_punktzahl, die die Punkte alsconst int *punkteund ihre Anzahl bekommt und die höchste Punktzahl zurückgibt. Gib inmainunter dem letztenprintfHöchste Punktzahl:und das Ergebnis vonhoechste_punktzahl(punkte, 5)aus. Das Programm gibtHöchste Punktzahl: 90aus.