Dlaczego wiele wskaźników może wskazywać na ten sam adres w C

13

W C możesz stworzyć zarówno chaos, jak i przejrzystość podczas pracy z pamięcią. Możesz mieć wiele wskaźników wskazujących na ten sam fragment pamięci RAM. To nie jest błąd. To jest funkcja.

Rozważmy scenariusz, w którym deklarujesz zmienną całkowitą „i”. Następnie tworzysz trzy wskaźniki całkowite: p, q i r.

Kod robi dokładnie to, czego można się spodziewać. p pobiera adres i. q robi to samo. r kopiuje to, co jest zapisane w p. Ponieważ p zawiera adres i, r wskazuje również na i.

Po dokonaniu tych przypisań masz jedną zmienną o czterech nazwach. „i” jest zmienną oryginalną. *p odnosi się do tego. *q odnosi się do tego. *r odnosi się do tego.

Jak działa przypisywanie wskaźników

Kluczem jest tu zrozumienie tego, co dzieje się podczas zadania. Kiedy piszesz q = &i, nie kopiujesz wartości i. Kopiujesz lokalizację i.

Kiedy piszesz r = p, kopiujesz adres z p do r. Nowa pamięć nie jest przydzielana. Dane nie są powielane. Wartość adresu jest przenoszona z jednej zmiennej wskaźnikowej do drugiej.

Oznacza to, że nie ma sztywnego ograniczenia liczby wskaźników, które mogą przechowywać ten sam adres. Możesz utworzyć tysiąc wskaźników wskazujących na „i”. Wszystkie odnoszą się do tego samego miejsca w pamięci.

Nie ma ograniczeń co do liczby wskaźników, które mogą przechowywać (a tym samym wskazywać) ten sam adres.

To zachowanie ma fundamentalne znaczenie dla sposobu, w jaki C zarządza pamięcią. Umożliwia tworzenie elastycznych struktur danych, takich jak połączone listy i drzewa. Pozwala także na sprawne przekazywanie argumentów do funkcji. Przekaż wskaźnik zamiast kopii. Modyfikuj bezpośrednio dane źródłowe.

Ale to stwarza również ryzyko. Zmień „i” na „p”. Spójrz na „i” do „q”. Zmiana będzie widoczna wszędzie. Jest tylko jedno źródło prawdy.

Zmienna „i” ma teraz cztery nazwy. „ja”. *p. *q. *r.

Tak działa C. Masz bezpośredni dostęp do adresów pamięci. Możesz tworzyć aliasy dla danych. Trzeba tylko uważać na to, co się zmienia.