Pointer to Multidimensional Array Casting – C++ – Rzutowanie wskaźnika na tablicę wielowymiarową

Często w C oraz C++ zachodzi potrzeba rzutowania wskaźnika np. int* na tablicę jakiegoś konkretnego rozmiaru np. int a[2][2]. Przykładowy przebieg sytuacji wygląda tak:

int size = 2;
int graph[2][2] =
{0, 1,
 1, 1};
int(*ptr)[size] = (int(*)[size])graph;
cout << ptr[1][1];

Jest to możliwe, gdyż tablice wielowymiarowe są w pamięci komputera, w przypadku C oraz C++, trzymane jako jednowymiarowa tablica. Dla przykładu:

tab1[3][3] <=> tab1[9]

Zapis o postaci:

int(*ptr)[size]

można interpretować jako rozwinięcie zwykłego wskaźnika int* ptr oznaczającego wskaźnik na pojedynczą liczbę int w stronę wskaźnika na bloki o rozmiarze size * sizeof(int). Dlatego na takim wskaźniku można wykonywać operacje, jak na dwuwymiarowej tablicy:

ptr[x][y] <=> ptr[x*size + y]

Taka sytuacja może nas spotkać, gdy chcemy przekazywać do funkcji wskaźniki bez podania żadnego wymiaru tablicy. Natomiast chcemy po obydwu stronach mieć możliwość operowania jak po tablicy wielowymiarowej. Dla przykładu:

int a[2][2] =
{0, 1,
 1, 1};
 
print( (int*)a, 2);
 
void print(int* graph, int size) {
    int(*ptr)[size] = (int(*)[size])graph;
 
    for(int i=0; i<size; i++)
        for(int j=0; j<size; j++)
            cout << ptr[i][j] << ", ";
}