Freigeben über


Indexoperator: []

Syntax

postfix-expression [ expression ]

Hinweise

Ein Postfixausdruck (der auch ein primärer Ausdruck sein kann), gefolgt von dem Indexoperator [ ], gibt eine Arrayindizierung an.

Informationen zu verwalteten Arrays in C++/CLI finden Sie unter Arrays.

Normalerweise ist der von postfix-expression dargestellte Wert ein Zeigerwert, z. B. ein Arraybezeichner, und expression ist ein ganzzahliger Wert (einschließlich Enumerationstypen). Syntaktisch erforderlich ist allerdings nur, dass einer der Ausdrücke vom Zeigertyp und der andere Ausdruck vom Ganzzahltyp ist. Daher kann sich der ganzzahlige Wert an der postfix-expression-Position befinden, und der Zeigerwert kann in eckigen Klammern an der expression- oder Indexposition stehen. Betrachten Sie das folgende -Codefragment:

int nArray[5] = { 0, 1, 2, 3, 4 };
cout << nArray[2] << endl;            // prints "2"
cout << 2[nArray] << endl;            // prints "2"

Im vorherigen Beispiel ist der Ausdruck nArray[2] identisch mit dem Ausdruck 2[nArray]. Der Grund dafür ist, dass das Ergebnis eines tiefgestellten Ausdrucks e1[e2] gegeben ist durch:

*((e2) + (e1))

Die durch den Ausdruck ermittelte Adresse liegt nicht e2-Bytes von der Adresse e1. Stattdessen wird die Adresse skaliert, um das nächste Objekt im Array e2 zu erhalten. Beispiel:

double aDbl[2];

Die Adressen von aDb[0] und aDb[1] sind 8 Byte voneinander entfernt – die Größe eines Objekts vom Typ double. Diese Skalierung nach Objekttyp wird von der Programmiersprache C++ automatisch ausgeführt und wird im Thema Additive Operatoren definiert, in dem Addition und Subtraktion von Operanden des Zeigertyps erläutert werden.

Ein indexierte Ausdruck kann auch mehrere Indizes haben, wie folgt:

Ausdruck1 [ Ausdruck2 ] [ Ausdruck3 ] ...

indexierte Ausdrücke sind von links nach rechts angeordnet. Der äußerste linke Indexausdruck Ausdruck1[Ausdruck2] wird zuerst ausgewertet. Die Adresse, die sich aus dem Hinzufügen von expression1 und expression2 ergibt, bildet einen Zeigerausdruck. Dann wird expression3 zu diesem Zeigerausdruck hinzugefügt, um einen neuen Zeigerausdruck zu bilden. Dies geht so lange weiter, bis der letzte Subscriptausdruck hinzugefügt wurde. Der Dereferenzierungsoperator* () wird angewendet, nachdem der letzte tiefgestellte Ausdruck ausgewertet wurde, es sei denn, der letzte Zeigerwert verweist auf einen Arraytyp.

Ausdrücke mit mehreren Indizes verweisen auf Elemente aus mehrdimensionalen Arrays. Ein mehrdimensionales Array ist ein Array, dessen Elemente Arrays sind. Beispielsweise ist das erste Element eines dreidimensionalen Arrays ein Array mit zwei Dimensionen. Im folgenden Beispiel wird ein einfaches, zweidimensionales Array aus Zeichen deklariert und initialisiert:

// expre_Subscript_Operator.cpp
// compile with: /EHsc
#include <iostream>

using namespace std;
#define MAX_ROWS 2
#define MAX_COLS 2

int main() {
  char c[ MAX_ROWS ][ MAX_COLS ] = { { 'a', 'b' }, { 'c', 'd' } };
  for ( int i = 0; i < MAX_ROWS; i++ )
     for ( int j = 0; j < MAX_COLS; j++ )
        cout << c[ i ][ j ] << endl;
}

Positive und negative Indizes

Das erste Element eines Arrays ist Element 0. Der Bereich eines C++-Arrays reicht von array[0] bis array[size – 1]. C++ unterstützt jedoch die positiven und negativen Indizes. Negative Indizes müssen innerhalb der Array-Grenzen liegen. Andernfalls sind die Ergebnisse unvorhersehbar. Der folgende Code zeigt positive und negative Arrayfeldindizes:

#include <iostream>
using namespace std;

int main() {
    int intArray[1024];
    for (int i = 0, j = 0; i < 1024; i++)
    {
        intArray[i] = j++;
    }

    cout << intArray[512] << endl;   // 512

    cout << 257[intArray] << endl;   // 257

    int *midArray = &intArray[512];  // pointer to the middle of the array

    cout << midArray[-256] << endl;  // 256

    cout << intArray[-256] << endl;  // unpredictable, may crash
}

Der negative Index in der letzten Zeile erzeugt eventuell einen Laufzeitfehler, weil er auf eine Adresse zeigt, die sich um 256 int-Positionen niedriger im Arbeitsspeicher befindet als der Ursprung des Arrays. Der Zeiger midArray wird in der Mitte intArrayvon initialisiert. Es ist daher möglich (aber gefährlich), sowohl positive als auch negative Arrayindizes für ihn zu verwenden. Array-Indexfehler generieren keine Fehler zur Kompilierzeit, führen jedoch zu unvorhersehbaren Ergebnissen.

Der Indexoperator ist kommutativ. Daher sind die Begriffe array[index] und index[array] garantiert gleichwertig, solange der Indexoperator nicht überladen wird (siehe Überladene Operatoren). Die erste Form entspricht der gängigsten Codierungspraxis, aber beide funktionieren.

Siehe auch

Postfixausdrücke
Integrierte C++-Operatoren, Rangfolge und Assoziativität
Arrays
Eindimensionale Arrays
Mehrdimensionale Arrays