Nun kennen wir zwar weitere Möglichkeiten zur Darstellung von Werten, aber ganz befriedigend ist das auch noch nicht. Stellen wir uns einmal vor, wir wollen 10 ganze Zahlen auf einmal darstellen. Natürlich könnte man dafür 10 Variablen anlegen, aber das ist mühselig und wird umso umständlicher, je mehr Zahlen man darstellen möchte. Weiterhin ist es bei einzelnen Variablen kaum möglich, Algorithmen umzusetzen, welche diese 10 Werte in erst zur Laufzeit bekannter Reihenfolge auswerten sollen. Wir benötigen also eine weitere Struktur, die uns 1. die Deklaration einer Sammlung von Werten gleichen Typs erlaubt und 2. auch einen Zugriff auf beliebige dieser Werte zur Laufzeit gestattet.
Das Mittel der Wahl zu diesem Zweck sind in C++ die sogenannten Arrays (oder deutsch Felder). Ein Array ist, wie angekündigt, eine Sammlung gleichartiger Werte mit wahlfreiem Zugriff auf diese Werte zur Laufzeit. Bei der Deklaration eines Arrays wird üblicherweise dessen Größe mit angegeben, so dass der Compiler bereits bei der Kompilierung berechnen kann, wie viel Speicherplatz auf dem Stack für dieses Array benötigt wird. Die Deklaration eines Arrays erfolgt über die Angabe des zugrunde liegenden Datentyps und der Größe, also etwa folgendermaßen:
int as[10];
Hier haben wir ein Integer-Array der Größe 10 (in den eckigen Klammern) deklariert, also ein Array, welches 10 ganze Zahlen enthalten kann (dass die Größe hinter dem Variablennamen und nicht hinter dem Datentyp steht, ist eine Eigenheit von C++ und etwas bedauerlich, leider aber nicht zu ändern). Möchten wir auf ein bestimmtes Element innerhalb des Arrays zugreifen, erfolgt ebenfalls durch die Nutzung der eckigen Klammern und der Angabe eines Indexes; um etwa dem 5. Element des Arrays einen Wert zuzuweisen, schreiben wir:
as[4] = 10;
Wer jetzt denkt, die 4
wäre ein Tippfehler, der irrt; Arrays sind in C++ 0-indiziert, das heißt, dass das erste Element im Array mit dem Index 0, das zweite Element mit dem Index 1 und so weiter angesprochen wird. Auf den ersten Blick ist das nicht sonderlich intuitiv, aber man gewöhnt sich dran. Möchte man alle Werte eines Arrays gleich bei der Deklaration des Arrays setzen, bietet sich die folgende Schreibweise an:
int as[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
Der folgende Code ist dagegen leider nicht möglich (die Gründe hierfür kenne ich allerdings nicht – wem sie bekannt sind, der möge es in den Kommentaren schreiben):
int as[10]; as = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
Als Index für ein Array lassen sich natürlich nicht nur konstante Zahlen benutzen; auch Variablen, welche eine natürliche (oder ganze) Zahl repräsentieren, können als Index verwendet werden. Das könnte dann etwa so aussehen (warum die Änderung am Array auch außerhalb des Funktionsaufrufes Auswirkungen hat, werden wir in einem zukünftigen Artikel sehen):
void set( int as[10], int i ) { as[i] = 5; }
Hierbei ist übrigens darauf zu achten, dass man sich innerhalb der Grenzen des Arrays aufhält, also keinen Index verwendet, der außerhalb des gültigen Bereiches liegt (für ein Array der Größe 10 gilt also: 0 ≤ i ≤ 9
). Leider kann der Compiler in der Regel nicht sicherstellen, dass diese Grenzen im Code eingehalten werden, so dass diese Aufgabe dem Programmierer obliegt. Noch schlimmer ist, dass auch zur Laufzeit des Programms Verletzungen der Array-Grenzen oft nicht bemerkt werden und darin münden, dass mit unsinnigen Werten gerechnet wird oder noch schlimmer, Werte in Speicherbereiche geschrieben werden, wo sie gar nicht hin sollten – es ist also besonders wichtig, sicherzustellen, dass die Grenzen eingehalten werden.
Gerechnet werden kann mit Array-Elementen ebenfalls; in folgendem Code etwa werden das i
-te und j
-te Element eines Arrays miteinander addiert und als Ergebnis zurückgegeben:
Kommentare (22)