C pozwala stworzyć „tłum” wokół jednej komórki pamięci. Nie musisz ograniczać się do jednego wskaźnika. Dowolna liczba wskaźników może wskazywać na ten sam adres. To nie jest błąd. Jest to cecha sposobu, w jaki C obsługuje odniesienia do pamięci.
Rozważmy prostą zmienną całkowitą typu „i”. Możesz zadeklarować trzy różne wskaźniki: p, q i r. Kod jest niezwykle prosty.
Spójrz na ostatnią linijkę. r wskazuje na to samo, na co wskazuje p. A ponieważ p ma już przypisany adres i, r w rzeczywistości wskazuje również na i.
Operator przypisania kopiuje adres z prawej strony na lewą. Nie kopiuje wartości przechowywanej pod tym adresem. Kopiuje sam adres. Jest to kluczowa różnica w arytmetyce wskaźników.
Po wykonaniu kodu „i” ma cztery nazwy. Do liczby całkowitej możesz odnosić się jako „i”. Możesz to zmienić poprzez *p. Możesz to przeczytać za pomocą *q. Możesz także odwoływać się do niego za pomocą *r.
Nie ma ograniczeń co do liczby wskaźników, które mogą przechowywać ten sam adres. Jeśli chcesz, możesz zadeklarować s, t i u. Wszystkie będą po prostu aliasami dla tej samej lokalizacji pamięci.
Ta elastyczność ma znaczenie. Umożliwia funkcjom udostępnianie odniesień do danych bez kopiowania dużych struktur. Umożliwia tworzenie złożonych struktur danych, w których wiele węzłów wskazuje na to samo dziecko. Dzięki temu zarządzanie zasobami w C jest bardziej efektywne.
Ale to także wprowadza ryzyko. Jeśli jeden wskaźnik zmieni wartość, wszystkie wskaźniki zobaczą zmianę. Żadnej izolacji. Musisz być ostrożny. Jeden wskaźnik modyfikuje liczbę całkowitą. Inni natychmiast to widzą.
Zmienna
ima teraz cztery nazwy:i,*p,*qi*r.
To jest podstawowa arytmetyka wskaźników. Ma to fundamentalne znaczenie dla zrozumienia modeli pamięci w C. Ale tu zaczyna się trudność. Wiele linków do jednego adresu oznacza wiele sposobów uszkodzenia danych.
Można w nieskończoność łączyć przypisania wskaźników. s = r; t = s;. Wszystko to wskazuje na „i”. Kompilatorowi to nie przeszkadza. Czas realizacji jest również taki sam. To są tylko adresy pamięci.
Dlaczego jest to ważne dla zwykłych użytkowników? Jeśli piszesz kod w C, polegasz na tym. Jeśli debugujesz awarię programu, często jest to przyczyną. Błędy wynikające z użycia po zwolnieniu rozwijają się w środowiskach, w których wskaźniki są ponownie przypisywane, ale nie są usuwane.
Wydajność odbywa się kosztem złożoności. Trzeba śledzić, kto jest właścicielem danych. Kto ma prawo je zmieniać? Gdy istnieje wiele wskaźników, taka kontrola staje się trudniejsza.
Ale siła tego mechanizmu jest niezaprzeczalna. Można przekazywać wskaźniki do funkcji. Zmień wartość. Oryginalna zmienna będzie odzwierciedlać tę zmianę. W ten sposób C osiąga semantykę referencyjną bez użycia obiektów.
To prosta koncepcja. Skopiuj adres. Nie kopiuj wartości. Pozwól, aby wiele nazw odnosiło się do jednej lokalizacji. Używaj go mądrze.





























