###### tags: `Zajęcia SP76`
# Tablice dwuwymiarowe
Tablice dwuwymiarowe pozwalają nam przechowywać zestawy danych, ale nie tak jak w zwykłej tablicy gdzie możemy przechowywać dane w ciągu, teraz możemy identyfikować dane po kolumnach i wierszach.
## Jak utowrzyć i używać takiej tablicy?
```cpp=
// W celu utowrzenia piszemy:
int tab[N][M]; // gdzie int to typ, N to liczba wierszy, a M kolumn
// różnice między deklaracją w funkcji oraz poza funkcją przedstawiłem w FAQ
// ...
tab[x][y] = 5; // do wiersza x oraz kolumny y, przypisujemy 5
func(4, tab[3]); // do funkcji func, jako drugi arguemnt przekazujemy trzeci wiersz tablicy. Ten wiersz będzie tablicą jednowymiarową.
```
Ten efekt da się również uzyskać na zwykłej tablicy gdzie zamiast odwoływać się do komórki **tab[row][col]** odwołujemy się do komórki **tab[row * n + col]**, gdzie $n$ to długość wiersza (aka ilość kolumn, czyli u nas $M$). Tak naprawdę to tablica dwuwymiarowa też jest tablicą jednowymiarową, kolejne wiersze leżą jeden za drugim w długiej tablicy jednowymiarowej.
Inaczej możemy to zinterpretować tak, że powstaje tablica jednowymiarowa, która ma N komórek, a w każdej komórce znajduje się kolejna tablica, która tym razem ma M komórek.
Stąd też, jak już może część z was zauważyła, jeżeli czasem czytacie błędy które kompilator wam wypisuje, typ tablicy dwuwymiarowej int **tab[N][M]** to **int****.
**int*** to typ zestawu danych, można pwoiedzieć **wskaźnik** na pamięć, w której są przechowywane inty, zatem **int**** to zestaw zestawów danych.
## Film
Dla ciekawych, więcej o tych ułożeniach danych oraz tych dziwnych gwiazdkach możecie objerzeć na kanale **The Cherno**.
[LINK!](https://youtu.be/gNgUMA_Ur0U)
:::info
Uwaga: Cherno używa w tym filmie notacji:
```cpp=
int* tab = new int[n];
```
Jest to prawie to samo, jakbyście zadeklarowali tablicę poza funkcją (w obu przypadkach jest deklarowana na stercie).
Dla uproszczenia możecie przyjąć, że Cherno w tych momentach pisze:
```cpp=
int tab[n];
```
:::