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

Wskaźniki - cpp

Object Storage Arubacloud
0 głosów
196 wizyt
pytanie zadane 22 sierpnia 2017 w C i C++ przez 7Maxim Nowicjusz (150 p.)
Witam, aktualnie uczę się wskaźników i mam dotyczące nich pytania.

Kiedy napiszę np. int *x;    cout << *x;   w konsoli pojawia się liczba 1528349827. Co to za liczba, co ona oznacza i skąd się tam wzięła?

Kiedy napiszę np. int *x;    cout << x;   w konsoli pojawia się 0x41655e. Rozumiem, że jest to adres szufladki, lecz której? Jest to adres wskaźnika *x? I co oznacza to "0x" w każdym adresie.

Z góry dzięki za odp i pozdrawiam! ;)

3 odpowiedzi

+3 głosów
odpowiedź 22 sierpnia 2017 przez criss Mędrzec (172,590 p.)
wybrane 22 sierpnia 2017 przez 7Maxim
 
Najlepsza

Kiedy napiszę np. int *x;    cout << *x;   w konsoli pojawia się liczba 1528349827. Co to za liczba, co ona oznacza i skąd się tam wzięła?

Tworzysz wskaźnik. Wskaźnik jest niczym innym jak typem liczb całkowitych, tylko że tutaj jest jasno powiedziane, że ta liczba jest adresem. Do wskaźnika nic nie przypisałeś więc przetrzymywana przez niego liczba (adres) to jakieś śmieci z pamięci. Następnie dostajesz się pod ten adres i wyświetlasz liczbe powstałą z 4 bajtów (bo int*) od tego adresu. Wyświetlona liczba jest zawartością pamięci pod adresem jaki "losowo otrzymał" wskaźnik.

Kiedy napiszę np. int *x;    cout << x;   w konsoli pojawia się 0x41655e. 

Identyczna sytuacja jak byś napisał
 

int a; std::cout << a;

Wyświetlone zostają śmieci z pamięci. U ciebie ta sama sytuacja (powiedzieliśmy już sobie, że wskaźnik to typ liczb całkowitych). Jest tylko ta różnica w outpucie ("0x"). 0x symbolicznie oznacza zapis szesnastkowy - tzn. "0x" jest swego rodzaju informacją, że wszystko za iksem powinieneś czytać jako liczbe w systemie szesnastkowym. Typy wskaźnikowe tak są po prostu domyślnie wyświetlane pewnie dlatego, że adresy to z reguły duże liczby.

Jest to adres wskaźnika *x?

Nie. Jest to adres przetrzymywany przez wskaźnik x (btw.: x, nie *x - gwiazdka nie należy do nazwy). Tak samo jak utworzysz sobie zwykłego inta i go wyświetlisz. Wyświetlona liczba jest tym co int przetrzymuje, a nie jego adresem.

We wskaźnikach nie ma żadnej magii. To zwykłe integery. Ok, jest mała różnica z "arytmetyką wskaźnikową", ale to wszystko.

Arytmetyka wskaźnikowa:
 

T* ptr = 0;
ptr = ptr + 1;
std::cout << std::boolalpha << ( (std::size_t)ptr == sizeof(T) ); // true

Dodanie do wskaźnika 1, nie oznacza dosłownie dodanie jedynki, tylko przesunięcie o sizeof typu T.

komentarz 22 sierpnia 2017 przez jpacanowski VIP (101,940 p.)

(dla autora tematu)

ptr = ptr + 1;

Dodanie do wskaźnika 1, nie oznacza dosłownie dodanie jedynki, tylko przesunięcie o sizeof typu T.

No bo nie został użyty operator * (pobranie wartości, wyłuskanie), więc w tym wypadku zwiększasz adres komórki pamięci o 1. Dziwne to tłumaczenie bo mąci. Żeby zwiększyć wartość o 1 napiszesz:

*ptr = *ptr + 1;
komentarz 23 sierpnia 2017 przez criss Mędrzec (172,590 p.)
edycja 23 sierpnia 2017 przez criss

 więc w tym wypadku zwiększasz adres komórki pamięci o 1.

Właśnie nie o 1. I to chciałem pokazać, że to nie jest faktycznie 1. Teraz ty mącisz :P

komentarz 23 sierpnia 2017 przez jpacanowski VIP (101,940 p.)
Tak, masz oczywiście całkowitą rację. Miałem ciężki dzień. Następnym razem przeczytam 2 razy i długo pomyślę ;)
+1 głos
odpowiedź 22 sierpnia 2017 przez vector Dyskutant (9,200 p.)

co oznacza to "0x" w każdym adresie.

0x oznacza że wartość jest zapisana za pomocą systemu szesnastkowego, dla przykładu 0xFF oznacza 255 w systemie dziesiętnym.

Rozumiem, że jest to adres szufladki, lecz której?

Jest to adres pamięci na który wskazuje wskaźnik x.

Jest to adres wskaźnika *x?

tak.

Co to za liczba, co ona oznacza i skąd się tam wzięła?

x jest wskaźnikiem a operator * wyłuskuje wartość spod adresu na który dany wskaźnik wskazuje czyli jeżeli x posiada wartość 0x41655e to *x zwraca wartość znajdującą się pod adresem 0x41655e.

komentarz 22 sierpnia 2017 przez 7Maxim Nowicjusz (150 p.)
Czyli, jeżeli stworzę wskaźnik np. int *x; i nie wskaże mu konkretnej zmiennej, na którą ma wskazywać, czyli np. nie napiszę x=&y;, to wskaźnik wskazuje wtedy jakąś losową szufladkę?
1
komentarz 22 sierpnia 2017 przez vector Dyskutant (9,200 p.)
zazwyczaj tak.
komentarz 22 sierpnia 2017 przez jpacanowski VIP (101,940 p.)
Nie tylko wskaźniki, ale zwykłe zmienne gdy nie zadeklarujesz ich wartości początkowej to też.
+1 głos
odpowiedź 22 sierpnia 2017 przez Kodeman Gaduła (4,480 p.)

Co do drugiego pytania, to tak. Wskaźnik wskazuje na adres, więc cout << x prosi o wyświetlenie tego adresu w pamięci. 0x oznacza, że adres jest w systemie szesnastkowym. Więcej o tym tutaj 

Co do pierwszego to wyświetlają Ci się śmieci. Nie zainicjalizowałeś wskaźnika x.

Podobne pytania

0 głosów
2 odpowiedzi 222 wizyt
pytanie zadane 12 kwietnia 2022 w C i C++ przez xTMx3 Obywatel (1,560 p.)
0 głosów
1 odpowiedź 671 wizyt
pytanie zadane 30 kwietnia 2020 w C i C++ przez Eriss69 Gaduła (4,470 p.)
0 głosów
1 odpowiedź 509 wizyt

92,572 zapytań

141,423 odpowiedzi

319,645 komentarzy

61,959 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...