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

Pytanie na temat wskaźnika (albo wskaźników) na tablicę dwuwymiarową.

VPS Starter Arubacloud
0 głosów
167 wizyt
pytanie zadane 21 marca 2020 w C i C++ przez Hubertius Bywalec (2,970 p.)

Hej

Muszę pryznać, że nie rozumiem poniższych linijek kodu:

 int tab[5][5];
    int(*t)[5];
    t = tab;
    int const* pointerToT = *t;

Czym jest ta linijka?  

int(*t)[5];

Na co tworzymy powyższe pięć wskaźników (bo tak to rozumiem)?

Skoro potem do wskaznika t przypisujemy adres w ten sposob:

t = tab;

To dlaczego potem do int const* (lub const int*) występuje zapis:

int const* pointerToT = *t;

, a nie:

int const* pointerToT = t;

? Odnoszę wrażenie, jakobyśmy do wskaźnika przypisywali teraz wartosc spod konkretnego adresu(choć wiem, że nie może tak być i w powyższym niezrozumiałym dla mnie zapisie przypisujemy do "stałego wskaźnika" wartosc  wskaznika t będącą adresem (czy może powinienem używać tutaj formy wskaźnika *t)? Możecie mi wyjaśnić te zapisy, bo przyznam się, że mam delikatny mętlik w głowie.  :/

Dotychczas operowałem na tablicach jednowymiarowych. Przyzwyczaiłem się, do zapisu takiego, np.

int tab[5];
int *pointer=tab // lub =&tab[0]

 

2 odpowiedzi

0 głosów
odpowiedź 21 marca 2020 przez profesorek96 Szeryf (91,420 p.)

Nie wiem czemu autor rozwiązania tak robi jak piszesz. Jednak od początku.

Tablica w C/C++ to nic innego jak n (rozmiar tablicy) komórek pamięci znajdujące się obok siebie.

Jeśli piszesz:

int tab[5];

Taki zapis powoduje zadeklarowanie tablicy składającej się z 5 komórek. Każda z komórek może przechowywać liczbę będącą typem int. Rozmiar tablicy to tak naprawdę 5*4 bajty czyli 20 bajtów. Oczywiście jeśli typowo int ma 4 bajty. Sama zaś nazwa tab to nic innego jak wskaźnik na element o indexie zero. Z arytmetyki wskaźników zapis tab+4 to nic innego jak taki zapis tab[4].

Tablica dwuwymiarowa to nic innego jak tablica zawierająca wskaźniki. Myślę że ten zapis rozjaśni ci:

int **tab=new int*[5];
for(int i=0;i<5;i++)
{
     tab[i]=new int[5];
}

W ten sposób jest tworzona tablica dynamiczna dwuwymiarowa o wymiarach 5 na 5. Oczywiście tak stworzoną tablice trzeba usunąć (zwolnić pamięć aby nie doszło do wycieku pamięci ale o tym później).

Jak widzisz najpierw tworzymy tablice zawierającą wskaźniki. Tablica ta ma 5 komórek, ko każdej z nich możemy przypisać jakąś pamięć. Inaczej mówiąc do każdej z komórek tablicy tab można dowiązać inna tablice. Ta operacja realizowana jest w pętli. Nawiasem mówiąc tablica trójwymiarowa to nic innego jak potrójny wskaźnik.

Oczywiście usuwanie takiej tablicy powinno przebiegać odwrotnie do jej tworzenia.

for(int i=0;i<5;i++)
{
     delete []tab[i];
}
delete []tab;

 

Jeśli chodzi o twoje pytania to ta linia:

	
int(*t)[5];

Powoduje stworzenie tablicy wskaźników o rozmiarze pięć elementów. W każdej komórce tablicy możemy wpisać adres na zmienna typu int.

Zapis ten jest poprawny ponieważ pointerToTo jest pojedynczym wskaźnikiem dlatego potrzebujemy operatora wyłuskania.

int const* pointerToT = *t;

Ten zapis jest równoznaczny temu:

int const* pointerToT = t[0];

Zwróć uwagę że nazwa tablicy to wskaźnik więc jeśli zmienna t to tablica wskaźników to samo t jest wskaźnikiem na t[0] zaś t[0] to zmienna przechowująca wskaźnik. Z tego wynika że t jest podwójnym wskaźnikiem.

Jeśli już mówimy o wskaźnikach to polecam sobie poczytać o wskaźniku na stały adres i na stałą wartość.

Zapis ten :

int const* pointerToT=t[0];

Powoduje że tworzymy wskaźnik na stały adres. Inaczej mówiąc nie będziemy mogli później przypisać zmiennej pointerToT innego adresu, zaś jesteśmy w stanie za pomocą tego wskaźnika zmienić wartość komórki na którą wskazuje ten wskaźnik.

komentarz 22 marca 2020 przez j23 Mędrzec (194,920 p.)

Sama zaś nazwa tab to nic innego jak wskaźnik na element o indexie zero.

Nie. tab to tablica, żaden wskaźnik. Ze wskaźnika nie jesteś w stanie wyciągnąć informacji o rozmiarze tablicy. Tablica konwertuje się niejawnie do wskaźnika na pierwszy element.

int(*t)[5];

Powoduje stworzenie tablicy wskaźników o rozmiarze pięć elementów.

Nie. To jest wskaźnik na tablice 5-elementową intów.

0 głosów
odpowiedź 22 marca 2020 przez j23 Mędrzec (194,920 p.)
edycja 22 marca 2020 przez j23

Na co tworzymy powyższe pięć wskaźników (bo tak to rozumiem)?

To jest wskaźnik na tablicę int[5].

Skoro potem do wskaznika t przypisujemy adres w ten sposob:

IMO powinno być t = &tab;

 

To dlaczego potem do int const* (lub const int*) występuje zapis:
   
int const* pointerToT = *t;

, a nie:
int const* pointerToT = t;

Bo jak wspomniałem, t jest wskaźnikiem na tablicę, *t jest wyłuskaniem tego wskaźnika, a przypisanie powoduje niejawną konwersję na wskaźnik do pierwszego elementu tablicy (tak jakbyś przypisywał tab do pointerToT).

Podobne pytania

+1 głos
1 odpowiedź 231 wizyt
0 głosów
1 odpowiedź 833 wizyt
pytanie zadane 13 czerwca 2017 w C i C++ przez Shiro Stary wyjadacz (10,300 p.)
0 głosów
4 odpowiedzi 2,087 wizyt

92,452 zapytań

141,262 odpowiedzi

319,085 komentarzy

61,854 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.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...