Jeśli decydujesz się na obsługę tablic n-wymiarowych na poziomie wskaźników do nich, sensownym pomysłem jest potraktowanie pamięci jako ciągłej. Alokacja która często poruszana w różnych tutorialach/kursach oraz (niestety) często na uczelniach, w postaci podwójnego/potrójnego/... wskaźnika, nie ma w praktyce sensu. Takie alokowanie wierszy będzie powodowało fragmentowanie pamięci, złą trafialność w cache oraz problemy w obsłudze.
Przy alokacji dynamicznej poprzez new, skazujesz się także na konieczność pamiętania o użyciu delete... a tu jest dużo niuansów o których nie warto teraz...
W trybie krok po kroku i nieco "postarzając" do dzisiejszych standardów C++:
#include <iostream>
int * createArray(const std::size_t size) {
return new int[size];
}
int * create2DArray(const std::size_t x, const std::size_t y) {
return new int[x * y];
}
void fillArray(int * const tab, const std::size_t size) {
for (unsigned i = 0U; i < size; ++i) {
tab[i] = i;
}
}
void fill2DArray(int * const tab, const std::size_t x, const std::size_t y) {
for (unsigned row = 0U; row < y; ++row) {
for (unsigned col = 0U; col < x; ++col) {
tab[row * x + col] = row * col;
}
}
}
void showArray(const int * const tab, const std::size_t size) {
std::cout << "1D Array:\n[ ";
for (unsigned i = 0U; i < size; ++i) {
std::cout << tab[i] << ' ';
}
std::cout << "]\n";
}
void show2DArray(const int * const tab, const std::size_t x, const std::size_t y) {
std::cout << "2D Array:\n[\n";
for (unsigned row = 0U; row < y; ++row) {
std::cout << "[ ";
for (unsigned col = 0U; col < x; ++col) {
std::cout << tab[row * x + col] << ' ';
}
std::cout << "]\n";
}
std::cout << "]\n";
}
int main() {
unsigned dim_x = 10U;
unsigned dim_y = 20U;
int * table1D = createArray(dim_x);
int * table2D = create2DArray(dim_x, dim_y);
fillArray(table1D, dim_x);
showArray(table1D, dim_x);
fill2DArray(table2D, dim_x, dim_y);
show2DArray(table2D, dim_x, dim_y);
// Niefajne, niezręcze ale konieczne by nie wyciekała pamięć...
delete [] table2D;
delete [] table1D;
}
Popatrz jak te indeksy są liczone i przekonaj się że... "pamięć jest płaska" :)