Zeiger und Arrays
In C sind Zeiger und Arrays enge Freunde. Der Name eines Arrays, für sich allein verwendet, ist die Adresse seines ersten Elements. Du kannst ihn also ohne & in einem Zeiger speichern:
#include <stdio.h>
int main(void) {
int zahlen[] = {3, 7, 1};
int *p = zahlen;
printf("%d\n", *p);
printf("%d\n", p[1]);
return 0;
}Das gibt aus:
3
7int *p = zahlen; bedeutet dasselbe wie int *p = &zahlen[0];, also ist *p das erste Element. Und mit einem Zeiger kannst du eckige Klammern verwenden, genau wie mit dem Array: p[1] ist das Element direkt nach dem, auf das p zeigt, hier die 7.
Die Elemente eines Arrays liegen im Speicher direkt nebeneinander. p + 1 ist die Adresse des nächsten Elements, und p[1] ist eine kürzere Schreibweise für *(p + 1). In diesem Kurs verwenden wir die eckigen Klammern, aber die andere Form siehst du in anderen C-Programmen.
Erinnere dich an den Fehler aus der Lektion über Arrays: Ein ganzes Array mit printf("%d\n", punkte); auszugeben lässt sich nicht kompilieren, und die Meldung sagt the argument has type 'int *'. Jetzt weißt du, warum: Der Name des Arrays ist eine Adresse vom Typ int * und keine Zahl für %d.
Das erklärt auch etwas, das du in der Lektion über Funktionen gesehen hast. Wenn du ein Array an eine Funktion übergibst, kopiert C es nicht. Es übergibt nur die Adresse seines ersten Elements. Ein Parameter int zahlen[] ist in Wirklichkeit ein Zeiger, also kannst du ihn auch als int *zahlen schreiben. Beides bedeutet genau dasselbe:
#include <stdio.h>
void verdopple_alle(int *zahlen, int anzahl) {
for (int i = 0; i < anzahl; i++) {
zahlen[i] *= 2;
}
}
int main(void) {
int preise[] = {10, 25, 40};
verdopple_alle(preise, 3);
printf("%d %d %d\n", preise[0], preise[1], preise[2]);
return 0;
}Das gibt aus:
20 50 80Über die Adresse arbeitet die Funktion mit dem Array des Aufrufers, deshalb bleiben ihre Änderungen. Das ist auch der Grund, warum die Funktion die Anzahl braucht: Sie bekommt nur die Adresse des ersten Elements und kann nicht sagen, wo das Array endet. Selbst sizeof(zahlen) / sizeof(zahlen[0]) hilft innerhalb der Funktion nicht. Dort ist zahlen ein Zeiger, also gibt sizeof die Größe des Zeigers an, und das Ergebnis ist falsch (hier ist es 1). Nur dort, wo das Array angelegt wurde, wie in main, sieht sizeof das ganze Array. Übergib die Anzahl also immer als Parameter.
So schreibst du es:
Anweisungen
- 1
Lege am Ende von
main(vorreturn 0;) einen Zeigerpauf das erste Element vonpunktean:int *p = punkte;. - 2
Gib darunter zwei Elemente über den Zeiger aus: den Text
Erstes:und*p, und in der nächsten ZeileZweites:undp[1]. Das Programm gibtErstes: 12undZweites: 7aus. - 3
Ändere den Parameter von
zeige_allevonint zahlen[]inint *zahlen. Das Programm gibt dasselbe aus wie vorher, weil beides dasselbe bedeutet. - 4
Schreibe unter
zeige_alleeine Funktionzu_allen_addierenmit den Parameternint *zahlen,int anzahlundint betrag, diebetragzu jedem Element addiert. Rufe sie am Ende vonmainmitpunkte,4und5auf und rufe dann noch einmalzeige_alle(punkte, 4)auf. Die letzte Zeile der Ausgabe ist17 12 20 14.