Operatore indice secondario: []

Sintassi

postfix-expression [ expression ]

Osservazioni:

Un'espressione di prefisso (che può anche essere un'espressione primaria) seguita dall'operatore [ ]di indice, , specifica l'indicizzazione di matrici.

Per informazioni sulle matrici gestite in C++/CLI, vedere Matrici.

In genere, il valore rappresentato da postfix-expression è un valore puntatore, ad esempio un identificatore di matrice, ed expression è un valore integrale (inclusi i tipi enumerati). Tuttavia, l'unica condizione da soddisfare dal punto di vista sintattico è che una delle espressioni sia di tipo puntatore e l'altra di tipo integrale. Di conseguenza, il valore integrale potrebbe trovarsi nella posizione postfix-expression e il valore del puntatore potrebbe trovarsi tra parentesi quadre nella posizione dell'espressione o dell'indice. Si consideri il frammento di codice riportato di seguito.

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

Nell'esempio precedente l'espressione nArray[2] è identica a 2[nArray]. Il motivo è che il risultato di un'espressione e1[e2] pedice è dato da:

*((e2) + (e1))

L'indirizzo restituito dall'espressione non è e2 byte dall'indirizzo e1. L'indirizzo viene invece ridimensionato per restituire l'oggetto successivo nella matrice e2. Ad esempio:

double aDbl[2];

Gli indirizzi di aDb[0] e aDb[1] sono separati da 8 byte, ovvero le dimensioni di un oggetto di tipo double. Questa scalabilità in base al tipo di oggetto viene eseguita automaticamente dal linguaggio C++ ed è definita in Operatori additivi in cui viene discussa l'aggiunta e la sottrazione di operandi di tipo puntatore.

Un'espressione di indice può inoltre avere più indici, come nel modo seguente:

expression1[expression2] [expression3] ...

Le espressioni di indice sono associate da sinistra a destra. L'espressione di indice più a sinistra, expression1[expression2], viene valutata per prima. L'indirizzo risultante dall'aggiunta di expression1 ed expression2 forma un'espressione puntatore; quindi expression3 viene aggiunta a quest'espressione puntatore per formare una nuova espressione puntatore e così via finché non è stata aggiunta l'ultima espressione di indice. L'operatore di riferimento indiretto (*) viene applicato dopo la valutazione dell'ultima espressione pedice, a meno che il valore del puntatore finale non indirizzi un tipo di matrice.

Le espressioni con più indici fanno riferimento a elementi di "matrici multidimensionali". Una matrice multidimensionale è una matrice i cui elementi sono matrici. Ad esempio, il primo elemento di una matrice tridimensionale è una matrice con due dimensioni. Nell'esempio seguente viene dichiarata e inizializzata una matrice bidimensionale di caratteri semplice:

// 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;
}

Indici positivo e negativo

Il primo elemento di una matrice è l'elemento 0. L'intervallo di una matrice C++ è compreso tra array[0] e array[size - 1]. Tuttavia, C++ supporta gli indici positivi e negativi. Gli indici negativi devono essere compresi nei limiti della matrice; in caso contrario, i risultati sono imprevedibili. Il codice seguente mostra indici di matrice positivi e negativi:

#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
}

L'indice negativo nell'ultima riga può generare un errore di run-time perché punta a un indirizzo 256 int posizioni inferiori in memoria rispetto all'origine della matrice. Il puntatore midArray viene inizializzato al centro di intArray. È quindi possibile (ma pericoloso) usare indici di matrice positivi e negativi su di esso. Gli errori dell'indice di matrice non generano errori in fase di compilazione, ma producono solo risultati imprevisti.

L'operatore di indice è commutativo. Pertanto, è garantito che le espressioni array[index] e index[array] siano equivalenti, purché l'operatore di pedice non sia sottoposto a overload (vedere Overloaded Operators). Il primo form è la procedura di codifica più comune, ma entrambi funzionano.

Vedi anche

Espressioni di suffissi
Operatori C++, precedenza e associazione
Matrici
Matrici unidimensionali
Matrici multidimensionali