
Autor: 22.03.2023
Co trzeba wiedzieć na temat wskaźników
Temat wskaźników ciągle się przewija wśród programistów C lub C++. To dość ważny element w tych językach programowania. Jednocześnie, wskaźniki dla wielu początkujących programistów są dość tajemnicze, wręcz niezrozumiałe. Mamy nadzieję, że ten artykuł choć trochę rozwieje twoje wątpliwości. I pomoże ci lepiej zrozumieć główne idee wykorzystania wskaźników w programowaniu.
C Developer
Naucz się języka C od podstaw i zdobądź praktyczne umiejętności programowania. Ta ścieżka kariery sprawi, że staniesz się pełnoprawnym kandydatem na Junior C Developera. Ścieżka zawiera dziesiątki zadań oraz ćwiczeń, które nauczą cię realnych, przydatnych na rynku pracy umiejętności. Ścieżka kariery C Developer to uporządkowana, rzetelna i praktyczna wiedza. Dowiedz się więcej
Definicja wskaźnika
Wskaźnik to zmienna, które wskazuje na adres innej zmiennej. Stąd nazwa - wskaźnik. W tradycyjnej zmiennej przechowujemy wartości:
- Zmienna x przechowuje wartość np. 1
- Zmienna score przechowuje wartość np. 200
- Zmienna user przechowuje wartość np. “Admin”
Z kolei wskaźniki przechowują adres do innej zmiennej. Czym jest ten adres? Przejdźmy do kolejnej części artykułu.
Tablica z adresami
Są języki programowania, w których pamięć można sobie wyobrazić jako tablicę. W tej tablicy przechowywane są wszystkie zmienne naszego programu. Jak pewnie wiesz, tablice w programowaniu posiadają swoje indeksy. A wskaźnik można sobie wyobrazić jako indeks, który pozwala się odwołać do konkretnego elementu w tablicy.
Czyli mamy tablicę ze zmiennymi. Każdy element w tej tablicy posiada swój indeks (adres), do którego odwołujemy się za pomocą wskaźników.
Jak to działa - prosty przykład
Teraz popatrzmy na przykład użycia wskaźników w języku C++. Wybraliśmy ten język, bo jest popularny i jednocześnie pozwoli nam łatwo zilustrować główne koncepcje. Oto nasz kod:
int *p;
Zadeklarowaliśmy wskaźnik o nazwie p, który wskazuje na wartości (zmienne) typu int. Co można zrobić z takim wskaźnikiem? Popatrz na kompletny kod:
int *p;
int digit = 7;
p = &digit;
std::cout << p;
Dodaliśmy zmienną typu int o nazwie digit, która przechowuje wartość 7. Ta linia jest kluczowa: p = &digit. Taki zapis możesz interpretować następująco: wskaźnik p, wskazuje na adres zmiennej digit. Nie na wartość, ale na adres - to ważne! Co się stanie jeśli uruchomimy nasz kod?
0x505278
Ten dziwnie wyglądający ciąg znaków, to adres zmiennej digit w pamięci komputera. Możemy powiedzieć, że zmienna digit znajduje się pod adresem 0x505278. Sprawdziliśmy to za pomocą naszego wskaźnika p. Do tego właśnie wskaźniki służą. Tylko co z tą wiedzą możemy zrobić? Zaraz się nad tym zastanowimy.
Przykładowe zastosowania
Wskaźniki mają swoje zastosowania - głównie w sytuacjach, gdy standardowe funkcjonalności języka nam nie wystarczają. Warto zauważyć, że te zastosowania są zależne w dużym stopniu od języka. Na przykład C++ jest bardziej wysokopoziomowym językiem niż C, i konieczność użycia wskaźników zachodzi rzadziej. Z kolei w C wskaźniki pełnią dużą istotniejszą rolę - pozwalają ominąć ograniczone funkcjonalności samego języka.
Są pewne obszary, w których wskaźniki mogą być przydatne.
- Optymalizacja wydajności kodu - wskaźniki, odpowiednio użyte mogą być czasem bardziej wydajne od alternatywnych rozwiązań.
- Programowanie niskopoziomowe np. w systemach zagnieżdżonych. Tutaj wskaźniki mogą czasem być jednym wyjściem na osiągnięcie założonego celu.
W języku C, wskaźników dość często używa się do następujących zadań:
- zwracanie więcej niż jednej wartości przez funkcję,
- przetwarzanie dynamicznych tablic, jeśli nie znamy ich rozmiaru;
To tylko wybrane przykłady, które mają z grubsza pokazać typowe zastosowania wskaźników.
Teraz czas na ważną uwagę. Wskaźniki generalnie wymagają odpowiedzialnego podejścia. Ich natura sprawia, że mogą być źródłem wielu, trudnych do zdiagnozowania błędów. To, że wskaźnik umożliwia dostęp do adresu danej zmiennej, może być czasem zbawieniem. Ale może też sprawić, że nadpiszemy przypadkowo wartości zmiennej w najmniej oczekiwanym momencie. To po prostu narzędzie, które wymaga uważnego i rozsądnego podejścia.
Jakie języki wykorzystują wskaźniki
Tradycyjnie wskaźników używało się na przykład w języku C. W trochę mniejszym stopniu w języku C++. Występują też one powszechnie w językach niskopoziomowych np. Assembler i pełnią w nich bardzo ważną rolę. Zresztą o tym już trochę wspominaliśmy.
Im bardziej wysokopoziomowy język, tym mniejszą rolę odgrywają wskaźniki. Warto też zauważyć, że niektóre języki używają wskaźników w sposób ukryty. Są one wykorzystywane przez wewnętrzne mechanizmy języka, ale programista nie ma do nich bezpośredniego dostępu.
Podsumowanie
Wskaźniki to specjalne zmienne, które wskazują na adresy innych zmiennych. W niektórych językach pełnią ona dość ważną rolę np. w C. Są też języki, które w ogóle nie posiadają mechanizmu wskaźników.
Wskaźniki to narzędzie, którego trzeba używać rozsądnie. To nie jest tak, że dają one jakieś magiczne moce i sprawiają, że kod będzie automatycznie bardziej wydajny. Źle użyte wskaźniki mogą przynieść więcej szkód niż korzyści. Oczywiście warto je poznać, zwłaszcza jeśli będziesz pracować w środowisku, które potrafi wykorzystać ich zalety.