One są identycznie indeksowane. Łamanie linii może trochę mylić. Przede wszystkim trzeba zaznaczyć, że w C/C++ tablice wielowymiarowe to tablice tablic. Nie ma tutaj żadnych rzędów ani kolumn. Elementy są w pamięci ułożone liniowo.
Więc tablica int[2][3][2] będzie w pamięci ułożona tak: [0][0][0], [0][0][1], [0][1][0], [0][1][1], [0][2][0], [0][2][1], [1][0][0], [1][0][1], [1][1][0], [1][1][1], [1][2][0], [1][2][1]
. Elementy są ułożone po kolei zaczynając od najbardziej wewnętrznego wymiaru. W przypadku zwykłego indeksowania za pomocą operatora []
nie trzeba koniecznie tego pamiętać, bo operator sam obliczy potrzebny adres, ale na pewno warto mieć to na uwadze. Procesor (czasem z małą pomocą kompilatora albo programisty) potrafi przewidzieć, że za chwilę będą potrzebne elementy położone obok i pobierze je z pamięci w większej paczce (pobieranie czegoś z pamięci jest dość czasochłonne).
I dlatego taki kod:
for(int i = 0; i < dim1; i++)
for(int j = 0; j < dim2; j++)
sum += numbers[i][j];
wykona się zazwyczaj kilkukrotnie szybciej od
for(int i = 0; i < dim2; i++)
for(int j = 0; j < dim1; j++)
sum += numbers[j][i];