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

Wsksaźniki - jak one właściwie działają

0 głosów
456 wizyt
pytanie zadane 17 października 2015 w C i C++ przez diego9403 Nowicjusz (120 p.)
Mam jednak pytania co do wskaźników, bo nie do końca je rozumiem.

Pierwsza sprawa to szybkość. Nie wiem dlaczego wskaźnik miałby być szybszy od zmiennej. Znaczy nie mówię, że nie jest szybszy, jednak nie wiem dlaczego tak jest.
Skoro wskaźnik jest zmienną, to program (komputer) musi pobrać ze wskaźnika wartość adresu, a później "pójść" do tego adresu i odczytać zmienną.
Natomiast do zmienne patrzy i widzi.
Moglibyście mi wytłumaczyć, co rozumie źle. Myślę o tym już od dwóch dni i nie mogę spać.

Następnie, jeśli dołączamy do funkcji orginalną zmienną (nie tablicę), to wpisujemy w deklaracji znak &. Jednak nie robimy tego w jej wywołaniu - dlaczego przecież powinnyśmy podać adresy zmiennych a nie same zmienne - tak jak w deklaracji.

I jeszcze jedno pytanie mam, ale to już bardzo trywialne. Znacie jakieś poradniki do nauki pisania czytelnego kodu, bo kiedyś wysłałem program do poprawy na forum i mówili mi, że mój kod jest niezbyt czytelny.

4 odpowiedzi

+3 głosów
odpowiedź 17 października 2015 przez furas Maniak (53,800 p.)
Wskaźnik jest tochę jak żeton z numerem wydawany w szatki.

Zamiast dzwigać płaszcz, dzwigasz tylko mały żeton. Łatwiej dźwigać dziesięć żetonów niż dziesięć płaszczy.

Każde przekazanie czegoś do funkcji to tworzenie duplikatu. Duplikat żetonu zajmuje mniej miejsca niż duplikat płaszcza. Mając duplikat żetonu wciąż istnieje tylko jeden płaszcza i jeśli posiadacz jednego żetonu (oryginału lub duplikatu) włoży do kieszeniu w płaszczu pieniądze to posiadacz drugiego żetonu (oryginału lub duplikatu) będzie mógł je wyciągnąć. A jeśli ktoś włoży pieniądze do duplikatu płaszcza to nie znajdziesz ich w oryginalnym płaszczu.

Jak tworzy się zmienną typu wskaźnik (np. int*) to tak jakby mieć żeton do pustego haczyka w szatni. Trzeba teraz powiesić jakiś płaszcza aby dało się coś do kieszeni wrzucić.

Jak tworzy się zmienną typu wskaźnik na wskaźniki (np. int**) to tak jakby mieć żeton do pustego haczyka na którym należy najpierw powiesić deskę z kilkoma haczykami i dopiero na tych haczykach będzie można powiesić kilka płaszczy.
0 głosów
odpowiedź 17 października 2015 przez Melchior Obywatel (1,300 p.)
Sam nie do końca ogarniam wskaźniki, w sensie wiem jak działają, tylko nie mam pomysłu na użycie i nie miałem okazji ich uzyć, zapewne jakbym mial zacząć ich używać to pisząc automatycznie bym sie nauczyl. Co do pisania bardziej czytelnego kodu, to rob zadania ze SPOJ'a, sam robiąc zadania powinienes zauwazac co mozna zapisac krócej, wyrazniej ;)
0 głosów
odpowiedź 17 października 2015 przez Dash Nałogowiec (29,650 p.)
Tak na szybko czym jest wskaźnik.

Masz element x. Powiedzmy że to jest jakaś duuuuża tablica albo obiekt. Musisz dostarczyć x-sa do funkcji. C++ działa tak że przekopiowuje przekazaną do funkcji zmienną i działa na jej kopii. Nawet dla nowoczesnych procesorów, kopiowanie setek/tysięcy czy jeszcze więcej bajtów będzie męczące. Dużo łatwiej posłać tam pachoła (wskaźnik) z numerem telefonu (adresem) żeby funkcja załatwiła swoje sprawy bezpośrednio z panem x, nie fatygując się o kopiowanie. Rozumiesz? Omijamy cały proces kopiowania - wysyłamy 4 bajty. Szybsze, nie :)? To tak z grubsza. Jak załapiesz koncepcję, to zaczniesz się nimi swobodnie posługiwać.

 

Druga sprawa - referencja. To samo co opisałem powyżej, tylko robione z automatu. Można powiedzieć że wskaźnik tworzy się za twoimi plecami.

Dessign patterns, zasaby pisania kodu obiektowego. Dużo tego jest, najlepsza jest praktyka i przemyślenie zanim się weźmie do pisania.

Nie traktuj tego jako czegoś encyklopedycznego. Sam miałem ogromne problemy ze wskaźnikami, dlatego postarałem się żebyś tylko chwycił idee. One pozwalają na dużo więcej, ale to już sam zobaczysz w kodzie, uwierz mi.
0 głosów
odpowiedź 17 października 2015 przez Szahid Pasjonat (20,970 p.)
Komputer chcąc  dostać się do zmiennej musi udać się do magistrali adresowej. Tam odszukuje adres gdzie dana zmienna zapisana jest w pamięci ram. Jeśli chcemy dużo razy dostać się do tej samej zmiennej to operacja ta musi się w całości powtarzać. Wskażnik to adres pod którym siedzi dana zmienna i pracując na wskaźnikach pomijasz ten etap szukania zmiennej w magistrali adresowej .

Polecam posłuchać https://www.youtube.com/watch?v=0DQl74alJzw&index=11&list=PLOYHgt8dIdoxx0Y5wzs7CFpmBzb40PaDo

 

od 9 minuty
komentarz 17 października 2015 przez Patrycjerz Mędrzec (192,320 p.)
OK, ale wskaźnik to też zmienna i też jej adres musi być przechowywany w magistrali adresowej, co nie? Więc jak to się dzieje, że takie odwoływanie się do pamięci jest szybsze?
komentarz 17 października 2015 przez Szahid Pasjonat (20,970 p.)
Naprzykład keiedy chcesz dobrać się do koleinych elementów tablicy.

Wtedy wystarczy że pobierzesz z jeden wskaźniki ( do pierwszego elementu tablicy).Aby zobaczyć koleine nie musisz już pytać komputera o adres do koleinego elementu wylko zwiększasz wskaźnik o 1.

 

Napisałem to tak w uproszczeniu żeby nie mącić Ci w głowie. Tak naprawde jeśli w tablicy przechowywane są zmienne typu całkowitego int to adres wskaźnika zwiększasz o 4 bajty
komentarz 17 października 2015 przez Patrycjerz Mędrzec (192,320 p.)
I tylko wtedy wskaźniki są szybsze od normalnego odwołania? Sądziłem, że w każdej sytuacji.

I tak tego nadal nie rozumiem. Wskaźniki są normalnymi zmiennymi, więc odwołanie się do nich też wymaga szukania adresu w magistrali, pobrania adresu z nich, a potem dodatkowo odwołania do zwykłej zmiennej. Przy zwykłym odwołaniu, system tylko musi odebrać adres z magistrali i wyciągnąć informacje ze zmiennej - trzy operacje vs dwie.

Wiem, że w rzeczywistości tak pewnie nie ma, ale przeczy mi się to z logiką. Filmik mi to zbyt obszernie nie wyjaśnił, a ogólnie ten przykład z tablicą był nietrafiony (z powodu natury tablic w C/C++).

Podobne pytania

0 głosów
4 odpowiedzi 1,040 wizyt
pytanie zadane 5 kwietnia 2016 w C i C++ przez Avernis Nałogowiec (27,400 p.)
+1 głos
2 odpowiedzi 808 wizyt
0 głosów
1 odpowiedź 2,354 wizyt
pytanie zadane 3 listopada 2020 w C i C++ przez Daaa22 Dyskutant (8,250 p.)

93,800 zapytań

142,768 odpowiedzi

323,461 komentarzy

63,421 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...