Array-Element []

Der Array-Element-Operator greift auf ein Element eines Arrays zu. Der Index des Arrays wird innerhalb von eckigen Klammern [] angegeben. Das Array, auf das zugegriffen werden soll, steht links davon.

#include <stdio.h> int main(){ int a[5] = {100, 200, 300, 400, 500}; printf("Element 3: %d\n", a[3]); a[2] = 333; printf("Element 2: %d\n", a[2]); return 0; }

Element 3: 400 Element 2: 333

Siehe auch Deklaration und Definition eines Arrays

Details

Der Array-Element-Operator erwartet einen Array-Operanden als lvalue und einen Index-Operanden als rvalue und wird von links nach rechts abgearbeitet. Der Rückgabewert ist ein lvalue. Der Array-Operand muss ein Array oder ein Pointer sein, der Index-Operand muss von integralem Typ sein.

Als Array-Operand kann ein beliebiger Ausdruck stehen, der zu einem lvalue ausgewertet wird, welcher ein Array oder einen Pointer darstellt. Wenn der Array-Operand als const deklariert ist, so gilt dies auch für den Rückgabewert.

Der Index-Operator muss von integralem Typ sein. Nach allgemeinem Bewusstsein sollte der Index zudem positiv, also grössergleich 0 sein, allerdings sind auch vorzeichenbehaftete Werte erlaubt ebenso wie Ausdrücke, welche zu signed int auswerten.

Durch die Abarbeitungsrichtung von links nach rechts wird es möglich, mehrdimensionale Arrays durch direktes Anfügen von weiteren Array-Element-Operatoren anzusprechen:

int b[2][3] = {{1, 2, 3}, {4, 5, 6}}; printf("Element 1, 2: %d\n", b[1][2]);

Element 1, 2: 6

Man achte bei diesem Beispiel auch auf die row-major-Speicherung (Zeilen zuerst), welche bei C und C++ verwendet wird. Weitere Erklärungen dazu können bei der Deklaration und Definition eines Arrays nachgelesen werden.

Der Array-Element-Operator wird in C und C++ als ein kommutativer Ausdruck gelesen. Dies bedeutet, er erwartet zwei Operanden, wobei einer davon innerhalb der eckigen Klammern stehen muss. Normalerweise und nach allgemeinem Bewusstsein steht innerhalb der eckigen Klammern der Index-Operator. Die Syntax von C und C++ allerdings erlaubt es, die beiden Operanden auch zu vertauschen. Die folgenden beiden Zeilen sind somit äquivalent, es wir jedoch stengstens angeraten, der üblichen Schreibweise zu folgen.

a[4] = 555; 4[a] = 555;

Standard

Überladen des Operators

Der Array-Element-Operator hat grundsätzlich die semantische Bedeutung des Ansprechens eines Elementes mit gegebenem Index in einer Struktur. Dem Programmierer steht jedoch frei, eine andere Semantik zu definieren. Oftmals wird mittels der Überladung des Array-Element-Operators der gegebene Index auf Gültigkeit geprüft, sprich, es wird sichergestellt, dass der gegebene Index in der Struktur auch existiert.

Die Prototypen für das Überladen des Array-Element-Operators sind die folgenden (Einschränkungen und Erläuterungen siehe Überladen von Operatoren):

Type operator [](Type); Type operator [](Type) const;

inside class

Dieser Operator kann ausserhalb der Klasse NICHT überladen werden. Ausserdem ist es mit überladenen Array-Element-Operatoren nicht mehr möglich, den Array- und den Index-Operanden zu vertauschen.

Im folgenden Beispiel wird eine Klasse präsentiert für einen RGB-Farbwert. Die Überladung des Array-Element-Operators-Operators gibt den Wert zurück, der zum gegebenen String passt.

#include <cstdio> #include <cstring> class Color{ int R, G, B; public: Color(int r, int g, int b){R = r; G = g; B = b;} int operator[](const char* index){ if(!strcmp(index, "Red")) {return R;} if(!strcmp(index, "Green")) {return G;} if(!strcmp(index, "Blue")) {return B;} return 0; } }; int main(){ Color c(15, 84, 27); printf("Red: %d\n", c["Red"]); printf("Green: %d\n", c["Green"]); printf("Blue: %d\n", c["Blue"]); }

Red: 15 Green: 84 Blue: 27