Operator indeksu dolnego: []

Składnia

postfix-expression [ expression ]

Uwagi

Wyrażenie postfiksu (które może być również wyrażeniem podstawowym), po którym następuje operator indeksu dolnego , [ ]określa indeksowanie tablicy.

Aby uzyskać informacje o tablicach zarządzanych w języku C++/CLI, zobacz Tablice.

Zazwyczaj wartość reprezentowana przez wyrażenie-postfiks jest wartością wskaźnika, taką jak identyfikator tablicy, a wyrażenie jest wartością całkowitą (w tym typami wyliczonymi). Jednak wszystko, co jest wymagane składniowo, jest to, że jedno z wyrażeń ma typ wskaźnika, a drugi jest typu całkowitego. W związku z tym wartość całkowita może znajdować się w pozycji wyrażenia-prefiksu, a wartość wskaźnika może znajdować się w nawiasach w wyrażeniu lub pozycji indeksu dolnego. Rozważmy następujący fragment kodu:

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

W poprzednim przykładzie wyrażenie nArray[2] jest identyczne z wyrażeniem 2[nArray]. Przyczyną jest to, że wynik wyrażenia e1[e2] indeksu dolnego jest podawany przez:

*((e2) + (e1))

Adres zwracany przez wyrażenie nie jest e2 bajtami z adresu e1. Zamiast tego adres jest skalowany w celu uzyskania następnego obiektu w tablicy e2. Na przykład:

double aDbl[2];

Adresy aDb[0] i aDb[1] mają 8 bajtów — rozmiar obiektu typu double. To skalowanie zgodnie z typem obiektu odbywa się automatycznie przez język C++ i jest definiowane w operatorach dodawania i odejmowania operandów typu wskaźnika.

Wyrażenie indeksu dolnego może mieć wiele indeksów dolnych, jak pokazano poniżej:

expression1[expression2] [expression3] ...

Wyrażenia indeksu dolnego są skojarzone od lewej do prawej. Wyrażenie indeksu dolnego po lewej stronie wyrażenie1[expression2] jest oceniane jako pierwsze. Adres, który wynika z dodawania wyrażenia expression1 i expression2 tworzy wyrażenie wskaźnika, a następnie wyrażenie3 jest dodawane do tego wyrażenia wskaźnika w celu utworzenia nowego wyrażenia wskaźnika itd. do czasu dodania ostatniego wyrażenia indeksu dolnego. Operator pośredni (*) jest stosowany po obliczeniu ostatniego wyrażenia w indeksie dolnym, chyba że końcowa wartość wskaźnika adresuje typ tablicy.

Wyrażenia z wieloma indeksami dolnymi odnoszą się do elementów tablic wielowymiarowych. Tablica wielowymiarowa jest tablicą, której elementy są tablicami. Na przykład, pierwszy element tablicy trójwymiarowej jest tablicą z dwoma wymiarami. Poniższy przykład deklaruje i inicjuje prostą dwuwymiarową tablicę znaków:

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

Indeksy dodatnie i ujemne

Pierwszym elementem tablicy jest element 0. Zakres tablicy C++ wynosi od tablicy[0] do tablicy[rozmiar — 1]. Język C++ obsługuje jednak indeksy dodatnie i ujemne. Ujemne indeksy podrzędne muszą mieścić się w granicach tablicy; jeśli tak nie jest, wyniki są nieprzewidywalne. Poniższy kod przedstawia dodatnie i ujemne indeksy dolny tablicy:

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

Ujemny indeks dolny w ostatnim wierszu może wygenerować błąd czasu wykonywania, ponieważ wskazuje on adres 256 int pozycji niższych w pamięci niż początek tablicy. Wskaźnik midArray jest inicjowany na środku ; dlatego jest możliwe (ale niebezpieczne) użycie zarówno dodatnich intArray, jak i ujemnych indeksów tablicy na nim. Błędy indeksu dolnego tablicy nie generują błędów czasu kompilacji, ale dają nieprzewidywalne wyniki.

Operator indeksu dolnego jest dojeżdżający. W związku z tym tablica wyrażeń[index] i index[array] mają gwarancję, że są równoważne, o ile operator indeksu dolnego nie jest przeciążony (zobacz Przeciążone operatory). Pierwsza forma jest najczęstszą praktyką kodowania, ale działa.

Zobacz też

Wyrażenia przyrostków
Wbudowane operatory, pierwszeństwo i kojarzenie języka C++
Tablice
Tablice jednowymiarowe
Tablice wielowymiarowe