1. Array – ein Container für Elemente
Wahrscheinlich hast du schon gehört, dass Computer riesige Mengen an Informationen verarbeiten können. Die if-else-Bedingung (if-else) und Schleifen (for, while) helfen dabei natürlich. Aber weit kommt man damit nicht, denn die Daten, die verarbeitet werden, müssen ja irgendwo gespeichert werden.
Dafür gibt es in C#, wie auch in fast allen Programmiersprachen, eine richtig coole Sache: Arrays (Array). Die werden auch manchmal Tabellen genannt.
Ein Array ist ein spezielles Objekt, in dem man nicht nur einen Wert, sondern mehrere speichern kann.
Wenn wir früher eine Variable mit einer Box verglichen haben (wo man einen Wert speichern kann), dann ist ein Array eher wie eine Box, die innen in Fächer unterteilt ist. Jedes Fach in der „Array-Box“ hat seine eigene Nummer. Die Nummerierung beginnt natürlich bei null...
Oder noch ein Vergleich: Stell dir ein normales Einfamilienhaus und ein Hochhaus vor. Im Einfamilienhaus wohnt eine Familie, das Hochhaus ist in Wohnungen aufgeteilt. Wenn du einer Familie im Einfamilienhaus einen Brief schreiben willst, brauchst du nur die Adresse des Hauses. Willst du aber einer Familie im Hochhaus schreiben, brauchst du die Adresse und die Wohnungsnummer.
Also, eine Array-Variable ist wie ein Hochhaus. Du kannst darin nicht nur einen Wert speichern, sondern mehrere. In so einer Variable gibt es mehrere Wohnungen (Zellen), auf die du über ihre Nummer (Index) zugreifen kannst.
Dafür schreibst du nach dem Variablennamen in eckigen Klammern den Index der Zelle, auf die du zugreifen willst. Das ist ziemlich einfach:
array[index] = wert;
Dabei ist array der Name der Array-Variable, index die Nummer der Zelle im Array und wert der Wert, den wir in die angegebene Zelle speichern wollen.
Aber lass uns erstmal anschauen, wie man Arrays erstellt.
2. Ein Array von Elementen in C# erstellen
Angenommen, dein Programm muss irgendwo 100 ganze Zahlen speichern. Dafür wäre ein Array wahrscheinlich perfekt. Wie erstellt man das?
Wenn wir nur eine ganze Zahl speichern wollten, würden wir den Typ int nehmen. Aber wenn wir 100 ganze Zahlen speichern wollen, brauchen wir wohl ein Array vom Typ int. So sieht der Code dafür aus:
int[] array = new int[100];
Schauen wir uns mal an, was da steht.
Wie du dir vielleicht schon gedacht hast, steht links vom Gleichheitszeichen die Deklaration der Variable mit dem Namen array und vom Typ int[]. Nach dem Typ int kommen die eckigen Klammern, die andeuten, dass man in diesen „Boxen“ nicht nur einen Wert, sondern mehrere speichern kann.
Rechts vom Gleichheitszeichen steht „Objekt erstellen“ (das Wort new) mit 100 Elementen (Zellen) vom Typ int. Auch nicht schwer.
Wenn wir zum Beispiel ein Array mit 20 Zellen für Gleitkommazahlen erstellen wollten, sähe der Code so aus:
double[] vals = new double[20];
Die Anzahl der Zellen im Array nennt man Array-Größe oder Array-Länge. Und weil Arrays viele Werte speichern können, nennt man sie auch Container.
Wichtiger Fakt: Die Größe eines Array-Containers kann nach dem Erstellen nicht mehr geändert werden.
Du kannst ein neues erstellen, aber die Länge eines bereits erstellten Containers kannst du nicht ändern.
3. Mit Array-Zellen arbeiten
Okay, Arrays erstellen können wir jetzt. Aber wie arbeitet man richtig damit?
Eigentlich fast genauso wie mit normalen Variablen, nur dass du nach dem Namen der Array-Variable immer die Nummer der Zelle angeben musst, mit der du arbeitest.
Die Nummerierung der Array-Zellen beginnt immer bei null. Wenn wir ein Array mit 10 Elementen haben, sind die Nummern (Indizes) der Zellen 0..9, bei einem Array mit 200 Elementen sind es 0..199. Und so weiter.
Beispiele:
int[] a = new int[10]; // Wir erstellen ein Array mit 10 Elementen vom Typ int.
a[2] = 4; // In die Zelle mit Index 2 schreiben wir den Wert 4.
a[7] = 9; // In die Zelle mit Index 7 schreiben wir den Wert 9.
a[9] = a[2] + a[5]; // In die Zelle mit Index 9 schreiben wir die Summe der Werte, die in den Zellen 2
// (da steht 4) und 5 (da steht 0) gespeichert sind.
Das wird nach Ausführung dieses Codes im Speicher stehen:
Die Spalte links vom Array (grau) sind die Nummern (Indizes) der Zellen. In den Zellen stehen die eingetragenen Werte: 4, 9 und 4. Direkt nach dem Erstellen sind die Array-Zellen mit Nullen gefüllt.
Wichtig. Alle Zellen eines Arrays haben denselben Datentyp. Wenn wir ein Array vom Typ string erstellen, können wir darin nur Strings speichern. Der Datentyp des Arrays wird beim Erstellen festgelegt. Weder den Datentyp noch die Länge des Arrays kann man später ändern.
4. Arrays im Speicher
Die Bilder in den vorherigen Beispielen sind ein bisschen ungenau.
Beim Erstellen von Arrays (wie auch bei Strings) werden im Speicher zwei Speicherblöcke reserviert: einer für das Array (den Container) selbst und einer für die Variable, die seine Adresse speichert. Die genaue Situation siehst du im Bild unten:
Grün ist das Array mit 10 Elementen vom Typ int und die Variable vom Typ int[], die die Adresse (Referenz) des Arrays vom Typ int im Speicher speichert.
Zum Vergleich ist blau eine normale Variable vom Typ int, die den Wert 199 speichert.
Erinnert ein bisschen an die Speicherung von Strings im Speicher, oder?
Genau, Strings. Und wie bei Strings kann man „Variablen vom Typ Array“ einander zuweisen:
int[] a = new int[10]; // Wir erstellen ein Array mit 10 Elementen vom Typ int.
a[2] = 4; // In die Zelle mit Index 2 schreiben wir den Wert 4.
a[7] = 9; // In die Zelle mit Index 7 schreiben wir den Wert 9.
int[] b = a; // In die Variable b speichern wir die Adresse, die in a steht.
// Jetzt zeigen a und b auf dasselbe Array-Objekt im Speicher.
a[9] = b[2] + a[7]; // In die Zelle mit Index 9 des Array-Objekts schreiben wir die Summe der Werte,
// die in den Zellen 2 (da steht 4) und 7 (da steht 9) gespeichert sind.
Das Array-Objekt bleibt dabei da, wo es ist, und die Variablen a und b speichern dieselbe Adresse (Referenz) auf dasselbe Objekt. Schau dir das Bild an:
5. Mehr Details zur Arbeit mit Arrays
Ein Array kann man aus jedem beliebigen Typ erstellen. Dafür musst du nach dem Typnamen einfach eckige Klammern schreiben. Die allgemeine Form zum Erstellen eines Arrays sieht so aus:
typ[] name = new typ[anzahl];
Dabei ist typ der Typ der Elemente (Zellen) des Arrays, die wir speichern wollen. name ist der Name der Variable, über die wir auf das Array zugreifen, und anzahl ist die Anzahl der Zellen im Array.
Im Beispiel oben siehst du die kanonische Form: Array-Variable deklarieren und Array-Objekt erstellen. Eigentlich sind das zwei unabhängige Konstrukte. Du kannst die Array-Variable und das Array-Objekt auch getrennt erstellen:
typ[] name;
name = new typ[anzahl];
Und noch ein wichtiger Punkt
Als Index eines Arrays und als Anzahl der Elemente im Array können auch Variablen oder sogar ganze Ausdrücke verwendet werden.
Beispiele:
int n = 100;
int[] a = new int[n]; // Array mit n Elementen erstellen
int n = 100;
int[] a = new int[n * 2 + 3]; // Array mit 203 Elementen erstellen
int n = 100;
int[] a = new int[n];
a[n-1] = 2; // a[99] = 2;
a[n-2] = 3; // a[98] = 3;
a[n/5] = a[n-1] + a[n-2]; // a[20] = a[99] + a[98];
Array-Grenzen überschreiten
Übrigens: Wenn du versuchst, auf eine Array-Zelle mit einem Index zuzugreifen, den es im Array nicht gibt (in unserem Fall sind das alle ganzen Zahlen außer 0..99), dann stürzt das Programm mit dem Fehler IndexOutOfRangeException ab – Index außerhalb des Arrays.
6. Die Länge eines Arrays
Wie wir im vorherigen Beispiel gesehen haben, kann man eine Variable vom Typ Array separat erstellen und ihr dann irgendwo im Code einen Wert (eine Referenz auf ein Array-Objekt) zuweisen. Man kann sogar so etwas machen:
int[] array; // Array-Variable vom Typ int[] erstellen
if (a < 10) // Wenn die Variable a kleiner als 10 ist,
array = new int[10]; // dann ein Array mit 10 Elementen erstellen.
else // Sonst
array = new int[20]; // ein Array mit 20 Elementen erstellen
Und wie arbeitet man dann mit so einem Array weiter? Wie erfährt man, wie viele Elemente es hat?
Dafür gibt es beim Array eine spezielle Eigenschaft (Variable) – length. Die Länge des Arrays erfährst du mit folgendem Ausdruck:
array.Length;
Dabei ist array der Name der Array-Variable und Length der Name der Eigenschaft des Array-Objekts. Den Wert der Eigenschaft Length kannst du nicht ändern: Du kannst den Wert von Length anderen Variablen zuweisen, aber du kannst Length selbst nichts zuweisen (das Programm wird einfach nicht kompilieren).
So kannst du das vorherige Beispiel fortsetzen:
int[] array; // Array-Variable vom Typ int[] erstellen
if (a < 10) // Wenn die Variable a kleiner als 10 ist,
array = new int[10]; // dann ein Array mit 10 Elementen erstellen.
else // Sonst
array = new int[20]; // ein Array mit 20 Elementen erstellen
for (int i = 0; i < array.Length; i++) // Schleife über alle Elemente des Arrays: von 0 bis array.Length – 1
{
Console.WriteLine(array[i]);
}
7. Fakten über Arrays in C#
Fassen wir die bekannten Fakten über Arrays zusammen:
- Fakt 1. Ein Array besteht aus vielen Zellen.
- Fakt 2. Der Zugriff auf eine bestimmte Zelle erfolgt über ihre Nummer.
- Fakt 3. Alle Zellen haben denselben Typ.
- Fakt 4. Anfangswert für alle Zellen ist 0 und null (wenn in der Zelle eine Adresse gespeichert wird), false (für den Typ bool).
- Fakt 5. string[] list ist nur die Deklaration der Variable: Der Container (das Array-Objekt) selbst ist noch nicht erstellt. Um damit arbeiten zu können, musst du ein Array (Container) erstellen und es in diese Variable legen, und erst dann kannst du es benutzen. Siehe Beispiel unten.
- Fakt 6. Wenn wir ein Array-Objekt (Container) erstellen, müssen wir angeben, wie lang es ist – wie viele Zellen es hat. Das macht man mit dem Befehl: new TypeName[n];
- Fakt 7. Die Länge des Arrays erfährst du mit der Eigenschaft .Length.
- Fakt 8. Nach dem Erstellen eines Arrays kann man weder den Typ seiner Elemente noch deren Anzahl ändern.
string s; // s ist null
string[] list; // list ist null
list = new string[10]; // Die Variable list speichert eine Referenz auf ein Array-Objekt – ein Array von 10 Strings.
int n = list.Length; // n ist 10
list = new string[0]; // Jetzt enthält list ein Array mit 0 Elementen.
// Das Array existiert, aber es kann keine Elemente speichern.
list = null;
Console.WriteLine(list[1]); // Es wird ein Programmfehler ausgelöst – das Programm stürzt ab.
// list enthält eine leere Referenz – null
list = new string[10];
Console.WriteLine(list[10]); // Es wird ein Fehler ausgelöst – Array-Grenze überschritten.
// Wenn list 10 Elemente/Zellen enthält, sind die erlaubten Indizes: 0 1 2 3 4 5 6 7 8 9 – insgesamt 10 Stück.
GO TO FULL VERSION