• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Tablice wskaźników

0 głosów
7,972 wizyt
pytanie zadane 17 kwietnia 2016 w C i C++ przez Dieet Nowicjusz (180 p.)

Witajcie

Czy mógłby ktoś wytłumaczyć prostym językiem czemu w c++ tablice wielowymiarowe są nazywane tablicami wskaźników? Mam rozumieć że np. w tablicy dwuwymiarowej wskaźników są wskaźniki odpowiadające liczbie wierszy wskazujące na początek adresu  kolumn, tzn. np.

int tab[][4] = {{1,2}, {3,4,5,6}};

jak wypiszę cout << *tab czyli adres pierwszego elementu to wskazuję na {1,2} ?

bo jeśli następnie zrobię

cout << **tab;

to wypisze mi zwykłą 1

Najlepiej na jakimś przykładzie tablic dwuwymiarowych znaków i liczb, żebym sobie to poukładał, jeśli źle rozumuję.

2 odpowiedzi

+5 głosów
odpowiedź 17 kwietnia 2016 przez Sebastian Fojcik Nałogowiec (43,040 p.)
edycja 6 stycznia 2022 przez Sebastian Fojcik

Tablice wielowymiarowe to nie są tablice wskaźników. Zwykła tablica wielowymiarowa posiada tylko jeden wskaźnik, którym jest nazwa tablicy. W przypadku tablicy wskaźników działa to trochę inaczej.

Patrycjerz w swoim obszernym wyjaśnieniu nie zahaczył o tablice wskaźników, więc ja to zrobię.

Tablica wskaźników, to tablica, której elementami są wskaźniki. Najczęstszym przykładem użycia takich tablic jest chęć przesłania tablicy wielowymiarowej nie znając żadnego z wymiarów. (Normalnie, aby przesłać tablicę, np.

int tab[ 4 ][ 5 ]; 

musimy funkcję zapisać tak:

int funkcja( int tab[][5] )

więc jak widać, tylko pierwszy wymiar może nie być podany. Pozostałe muszą. W przypadku tablic wskaźników te ograniczenia nie występują.

Dużą różnicą między zwykłą tablicą wielowymiarową, a tablicą wskaźników jest to, że dla każdego wskaźnika w takiej tablicy musisz po kolei rezerwować pamięć. To tak jakbyś miał w tablicy jedną kolumnę (wskaźników) i dla każdego elementu w tej kolumnie, od góry do dołu, musiał rezerwować w pamięci wiersz.
A teraz stworzenie tablicy o tych samych wymiarach co powyżej i przesłanie jej do funkcji.

int ** tab = new int* [ 4 ];

// Rezerwowanie w pamięci kolejnych wierszy
for( int i = 0; i < 4; i++ )
{
    tab[ i ] = new int [ 5 ];
}

I teraz funkcja może przyjmować dowolną tablicę wielowymiarową.

int funkcja( int** tab, int wys, int szer );
// Lub: int funkcja( int* tab[], int wys, int szer );
// Lub: int funkcja( int tab[][], int wys, int szer );

Gdybym miał przedstawić tablicę wskaźników na schemacie, to zrobiłbym to tak:

Sama tablica tab zawiera tylko 4 wskaźniki. Te wskaźniki są dopiero 5-elementowymi tablicami. W ten sposób otrzymaliśmy dynamiczną tablicę 4 x 5.

Pozdrawiam.

2
komentarz 22 października 2021 przez Eliasz Nowicjusz (200 p.)
Założyłem specjalnie konto na tej platformie żeby podziękować za tak fajne wytłumaczenie
+4 głosów
odpowiedź 17 kwietnia 2016 przez Patrycjerz Mędrzec (192,320 p.)

Podobne pytania

0 głosów
0 odpowiedzi 369 wizyt
pytanie zadane 8 lipca 2018 w C i C++ przez niezalogowany
0 głosów
1 odpowiedź 1,032 wizyt
0 głosów
2 odpowiedzi 336 wizyt
pytanie zadane 11 stycznia 2021 w C i C++ przez Icar Nowicjusz (150 p.)

93,425 zapytań

142,421 odpowiedzi

322,647 komentarzy

62,787 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...