###### 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]; ``` :::