Wskaźniki 137
Jak dotąd, krok po kroku, zobaczyłeś jak przypisywać adresy zmiennych do wskaźników. Jednak w praktyce nigdy nie będziesz tak postępować. Dlaczego komplikować kod poprzez wprowadzanie wskaźników, skoro mamy możliwość prostego odczytywania i modyfikacji zmiennych. Jedynym powodem, dla którego pokazaliśmy takie metody działań na wskaźnikach była demonstracja, jak działa mechanizm wskaźników. Teraz, kiedy już wiesz, jak wykorzystać wskaźniki, możesz zrobić z nich dobry użytek. Zazwyczaj wskaźniki są wykorzystywane w trzech sytuacjach:
□ Zarządzanie danymi w pamięci operacyjnej.
□ Dostęp do wnętrza klas - danych i funkcji.
□ Przekazywanie wartości do zmiennych poprzez referencje.
W dalszym ciągu tego rozdziału skupimy się na zarządzaniu danymi w pamięci i dostępie do wewnętrznych elementów klasy — danych i funkcji. W trakcie godziny 10 — „Zaawansowane wykorzystanie wskaźników” poznamy zasady przekazywanie zmiennych do funkcji przez referencje.
Programiści na ogól wyróżniają pięć obszarów pamięci:
Obszar zmiennych globalnych
Wolna pamięć
Rejestry
Kod programu
Stos
Zmienne lokalne wraz z parametrami funkcji są przechowywane na stosie. Kod znajduje się w obszarze kodu programu (co jest chyba oczywiste). Zmienne globalne również znajdują się w przeznaczonym dla siebie obszarze. Rejestry są wykorzystywane do wewnętrznego zarządzania funkcjami (np. do przechowywania adresu szczytu stosu lub wskaźnika instrukcji). Cała pozostała pamięć jest dla programu wolna (określa się ją czasem jako stertę - ang. heap).
Problem ze zmiennymi lokalnymi polega na tym, że wraz z zakończeniem funkcji są one przez program „zapominane”. Zmienne globalne rozwiązują ten problem, jednak kosztem nieograniczonego dostępu do nich z dowolnego miejsca w programie, co niesie ze sobą znaczną komplikację kodu. Umieszczenie danych w wolnej pamięci operacyjnej rozwiązuje oba problemy.
Możesz z powodzeniem traktować wolną pamięć jako ogromy zbiór sekwencyjne ułożonych komórek pamięci „czekających” na dane. Jednak dostęp do tych komórek nie jest tak swobodny jak np. dostęp do stosu. Przed wykorzystaniem komórki trzeba „poprosić” system operacyjny o przydzielenie adresu i zarezerwowanie odpowiedniej liczby komórek. Dopiero wtedy można taki adres przypisać do wskaźnika i wykorzystywać.
Jak dotąd, krok po kroku, zobaczyłeś jak przypisywać adresy zmiennych do wskaźników. Jednak w praktyce nigdy nie będziesz tak postępować. Dlaczego komplikować kod poprzez wprowadzanie wskaźników, skoro mamy możliwość prostego odczytywania i modyfikacji zmiennych. Jedynym powodem, dla którego pokazaliśmy takie metody działań na wskaźnikach była demonstracja, jak działa mechanizm wskaźników. Teraz, kiedy już wiesz, jak wykorzystać wskaźniki, możesz zrobić z nich dobry użytek. Zazwyczaj wskaźniki są wykorzystywane w trzech sytuacjach:
□ Zarządzanie danymi w pamięci operacyjnej.
□ Dostęp do wnętrza klas - danych i funkcji.
□ Przekazywanie wartości do zmiennych poprzez referencje.
W dalszym ciągu tego rozdziału skupimy się na zarządzaniu danymi w pamięci i dostępie do wewnętrznych elementów klasy - danych i funkcji. W trakcie godziny 10 -„Zaawansowane wykorzystanie wskaźników” poznamy zasady przekazywanie zmiennych do funkcji przez referencje.
Programiści na ogół wyróżniają pięć obszarów pamięci:
Obszar zmiennych globalnych
Wolna pamięć
Rejestry
Kod programu
Stos
Zmienne lokalne wraz z parametrami funkcji są przechowywane na stosie. Kod znajduje się w obszarze kodu programu (co jest chyba oczywiste). Zmienne globalne również znajdują się w przeznaczonym dla siebie obszarze. Rejestry są wykorzystywane do wewnętrznego zarządzania funkcjami (np. do przechowywania adresu szczytu stosu lub wskaźnika instrukcji). Cała pozostała pamięć jest dla programu wolna (określa się ją czasem jako stertę - ang. heap).
Problem ze zmiennymi lokalnymi polega na tym, że wraz z zakończeniem funkcji są one przez program „zapominane”. Zmienne globalne rozwiązują ten problem, jednak kosztem nieograniczonego dostępu do nich z dowolnego miejsca w programie, co niesie ze sobą znaczną komplikację kodu. Umieszczenie danych w wolnej pamięci operacyjnej rozwiązuje oba problemy.
Możesz z powodzeniem traktować wolną pamięć jako ogromy zbiór sekwencyjne ułożonych komórek pamięci „czekających” na dane. Jednak dostęp do tych komórek nie jest tak swobodny jak np. dostęp do stosu. Przed wykorzystaniem komórki trzeba „poprosić" system operacyjny o przydzielenie adresu i zarezerwowanie odpowiedniej liczby komórek. Dopiero wtedy można taki adres przypisać do wskaźnika i wykorzystywać.