W C można utworzyć wiele wskaźników wskazujących tę samą lokalizację w pamięci. To nie jest błąd. Jest to cecha języka.
Możesz zadeklarować trzy wskaźniki do liczb całkowitych: p, q i r. Następnie możesz ustawić je wszystkie tak, aby wskazywały tę samą zmienną całkowitą „i”.
Spójrz, co się tutaj dzieje. p pobiera adres i. q również otrzymuje adres i. r pobiera to, co jest zapisane w p. Mianowicie adres „i”.
Po wykonaniu tego kodu powstaje osobliwa sytuacja. Zmienna „i” ma teraz cztery nazwy. Możesz się do niego odwoływać używając i, *p, *q lub *r. Wszystkie odnoszą się do tego samego obszaru pamięci RAM.
Jak działa przypisywanie wskaźników
Przypisując jeden wskaźnik do drugiego, nie kopiujesz wartości, na którą wskazują. Kopiujesz adres.
r = p nie kopiuje liczby całkowitej i. Kopiuje adres pamięci zapisany w p. Ponieważ p zawiera adres i, r zawiera teraz także adres i.
Nie ma ograniczeń co do liczby wskaźników, które mogą dzielić jeden adres. Możesz mieć dziesięć wskazówek. Albo sto. Wszystkie wskazują po prostu na to samo.
Dlaczego to jest ważne
To zachowanie zmienia sposób myślenia o danych. Jedna zmienna w pamięci może mieć wiele aliasów. Jeśli zmienisz wartość za pomocą jednego wskaźnika, każdy inny wskaźnik zobaczy zmianę.
Teraz „i” jest równe 10. „q” jest równe 10. „ r” jest równe 10. Wszyscy patrzą na te same dane.
Jest to przydatne. Pozwala to na przekazywanie referencji do funkcji bez kopiowania dużych struktur. Dzięki temu różne części kodu mogą pracować na tych samych danych. Ale to oznacza również, że musisz zachować ostrożność. Zmiana dokonana za pomocą jednego wskaźnika może wpłynąć na inne.
Powszechne błędne przekonania
Niektórzy początkujący programiści uważają, że przypisanie wskaźnika kopiuje dane. To jest błędne. Adres zostanie skopiowany.
Inni zastanawiają się, czy istnieje granica. Nie ma go. Język pozwala na utworzenie dowolnej liczby wskaźników. Kompilator temu nie zapobiega.
Podsumowanie
Wiele wskaźników może wskazywać na ten sam adres. Jest to standardowe zachowanie w C. Można przypisywać sobie nawzajem wskaźniki. Kopiowany jest adres, a nie wartość. Zmienna pozostaje taka sama. Liczba jej „imion” po prostu rośnie.
„Nie ma ograniczeń co do liczby wskaźników, które mogą przechowywać (a zatem wskazywać) ten sam adres.”
Ta elastyczność jest potężna. Wymaga dyscypliny. Ale ma to fundamentalne znaczenie dla działania C. Jeśli to rozumiesz, rozumiesz jedną z kluczowych koncepcji zarządzania pamięcią w C.


























