Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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 intArray
von 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