Skomplikowany zapis deklaracji wskaźników

0

Otóż mam taki problem, że zaczynam dopiero wskaźniki i nie rozumiem takiego oto kodu i prosiłbym o wytłumaczenie kilku zaznaczonych linijek:)

    int rozmiar;
    cout << "Podaj rozmiar tablicy: ";
    cin >> rozmiar;

    int *tablica;      // tutaj deklarujemy wskaznik wskazujacy typ int o nazwie tablica (jasne) //
    tablica = new int [rozmiar];  // a tutaj jest kosmos, nagle z jednego wskaźnika robi sie ich tablica, jak??:/ //

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

No i jeszcze pętla:
Przy cout'cie zawartosci wskaznika nie ma okreslonych komorek [] tablicy, np od tablica[0] lecimy do zad rozmiaru do np tablica[x], no i stąd nie wiem skąd zaczynamy.
I linia nizej z inkrementacją, i tu problem z linijki wyzej, nie ma [] wiec jak zwiekszamy komorke tablicy?? #mind fck //

2

Tak działa arytmetyka wskaźników - mając adres zmiennej w pamięci równie dobrze może być to pierwszy element tablicy jak i po prostu jedna zmienna.

Tak zostało to rozwiązane w C i tak zostało zaimportowane do C++.

mając taki wskaźnik, wiedz o kilku rzeczach:

  • tablica+1 doda do wskaźnika długość jednego elementu (nie bajtu!), więc będzie wskazywać na następny element tablicy (o ile to jest rzeczywiście tablica)
  • *tablica to dereferencja
  • tablica[n] to to samo co *(tablica+n)

BTW: https://dsp.krzaq.cc/post/176[...]xx-kiedy-uzywac-new-i-delete/

0

Czyli jesli dobrze rozumiem, mozemy "inkrementowac" zmienna o nazwie tablica?, bo ona jest takze adresem pierwszej komorki tablicy? i "zwiekszając" zmienna dostajemy sie danej komorki?
Edit: Ale nadal chyba nie wiem jak z jednej zmiennej ze wskaznikiem powstala ich cala tablica..

0

Zwiększając ją (a właściwie wykonując na niej operacje arytmetyczne) poruszasz się po tablicy.

Nie wiem czy podpasuje Ci ta analogia, ale wskaźnik to taki nr. domu na ulicy. Dodasz 1 to masz następny, odejmiesz to masz poprzedni, a żeby zobaczyć co jest w środku musisz wejść za pomocą *.

0

wskaźnik to taki nr. domu na ulicy.

Dodałbym chyba, ze do domow sa przyczepione skrzynki, a w ich srodku jest nr domu xd, Ale to moje wyobrażenie:d
A co do poprzedniej Twojej odpowiedzi to wlasnie co by bylo gdybym dodal do zmiennej ze wskaznikiem +1 a to nie bylaby tablica?

0

To miałbyś tzw. UB, czyli niezdefiniowane zachowanie. Nie da się rzetelnie powiedzieć co się wtedy stanie, bo język tego nie definiuje. Ty, jako programista, masz do tego po prostu nie dopuścić.

To samo dotyczy np. wyjścia więcej niż 1 element poza koniec tablicy, lub próba dereferencji obiektu poza końcami tablicy.

Co do skrzynek to nie rozumiem za bardzo. Rozwijając analogię:

// PSEUDOKOD
Dom* krakowskie_przedmieście = 48; // pałac prezydencki, krakowskie przedmieście 48
krakowskie_przedmieście + 10; // adres krakowskie przedmieście 58
*krakowskie_przedmieście; // dereferencja, w tej analogii wchodzisz do pałacu prezydenckiego
krakowskie_przedmieście[0]; // to samo
krakowskie_przedmieście[10]; // wchodzisz do budynku pod adresem krakowskie przedmieście 58
0

Pomyslalem ze moze moglibysmy zmienic adres wskaznika o 1 bit:d

0

Co do skrzynek to nie rozumiem za bardzo.

Jesli chcesz zrozumieć jak ja mysle:):
Istnieje dom.
Istnieje jego adres w skrzynce, ale nwm jak ja otworzyc.
Tworze wskaznik z nazwą domu zeby moc otworzyc skrzynke i dostac sie do jego adresu-nr domu:d

0

Nie, dostajesz się do zawartości, nie do adresu.

Może zamiast domów numerowane skrytki np. jak są na dworcach.

Numer skrytki to jej adres. Co jest w środku to zawartość. Adres możesz zwiększać/zmniejszać i będzie on wskazywał na różne skrytki. Po dereferencji uzyskasz zawartość skrytki.

0

No tak, ale uzywając nazwy wskażnika, odczytujemy adres, a uzywając operatora wskaźnika dostajemy sie do środka. Te analogie są do bani, cięzko to porównac, moje zdanie. Widzisz ja myslalem wcześniej o tym pierwszym dostaniu sie do skrzynki, a Ty do zawartości zmiennej, DAmn, cięzko użyc jednej analogii. Anyway dzięki za poświęcony czas, wracam do nauki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0