ciekawostki programistyczne...

piątek, 12 lutego 2010

Zastosowań wskaźników ciąg dalszy - tablice wielowymiarowe

W poprzednim poście opisałem sposób dynamicznego przydziału pamięci dla tablicy jednowymiarowej. Przy okazji chciałbym powiedzieć, ze do poprzedniej notki wkradł się błąd dotyczący funkcji calloc, który już poprawiłem. W tej notce również będzie o tablicach, tym razem zajmiemy się jednak tablicami wielowymiarowymi. O ile w przypadku tablicy wielowymiarowej, gdzie znamy jej rozmiar już w trakcie tworzenia programu, nie ma wielkich problemów, to jednak, w momencie kiedy zechcemy przydzielić dla niej pamięć dynamicznie, sprawa nieco się komplikuje. Mam jednak nadzieje, że po przeczytaniu tej notki, wiele się wyjaśni. Na początek zastanówmy się jakie "narzędzia" będą nam potrzebne. Poznane do tej pory "normalne" sposoby tworzenia tablicy oraz wskaźniki niestety nie wystarczą. Tym czego nam potrzeba jest: wskaźnik na wskaźnik. Hmm... zdaje sobie sprawę, że nie brzmi to zbyt zachęcająco, szczególnie, jeżeli nie masz jeszcze dostatecznej wprawy w "żonglowaniu" normalnymi wskaźnikami. Otóż wskaźnik na wskaźnik, jak sama nazwa wskazuje, nie jest normalny wskaźnikiem, którego poznaliśmy do tej pory, i który pokazywał na zmienną. Jest to konstrukcja, która pokazuje na wskaźnik. Tworzenie tablicy dwu-wymiarowej zaczniemy więc od wskaźnika, który będzie pokazywał na jednowymiarową tablicę wskaźników, które to z kolei będą pokazywać na kolejne jednowymiarowe tablice, będące wierszami naszej tablicy dwu-wymiarowej. Aby lepiej to zrozumieć polecam przeanalizować kod:

int wiersze; // tutaj trzeba wczytać ilość wierszy
int kolumny; // tutaj trzeba wczytać ilość kolumn

int **tablica; // tworzymy wskaźnik na wskaźnik

tablica = new int*[wiersze]; // tworzymy tablice wskaźników do wierszy

for(int i = 0; i < wiersze; i++)
{
tablica[i] = new int[kolumny]; // tworzymy kolumny
}

Ja łatwo się domyślić, kasowanie tablicy, również musi przebiegać w nieco odmieniony sposób. Musimy zacząć od kasowania kolumn, a dopiero potem skasować tablicę wskaźników do wierszy. Oto kod:

for(int i = 0; i < wiersze; i++)
{
delete[] tablica[i];
}
delete[] tablica;

Analogicznie postępujemy w przypadku tworzenia tablic o większej liczbie wymiarów. Kody zostały podane w wersjach z wykorzystaniem operatora new. W ramach ćwiczeń polecam samodzielnie przećwiczyć sobie deklarowanie tablic wielowymiarowych z wykorzystaniem malloc, calloc i free.

0 komentarze:

Prześlij komentarz