Definiowanie wskaźników w C++
Wskaźniki to jeden z niewielu elementów w C++ który co prawda nie jest konieczny przy pisaniu aplikacji, ale jego znajomość znacznie ułatwia pracę programistą. Zrozumienie ogólnej idei działania wskaźników nie jest trudne, ale sam temat jest dość rozległy dlatego też poświęcę temu zagadnieniu kilka artykułów. Zaczniemy od rzeczy najistotniejszej czyli wyjaśnienia sposobu działania wskaźników oraz przykłady ich użycia.
Wskaźnik w programowaniu to nic innego jak normalny wskaźnik, który używamy na przykład do wskazania jakiegoś miasta na mapie czy kubka z herbatą stojącego na biurku. Różnica jest tylko taka, że definiując wskaźnik w C++ nie wskazujemy na jakąś rzecz tylko na adres pamięci w którym przechowywane są jakieś dane. Czasami są to informacje przydatne programiście na przykład jakieś stałe, a czasami śmieci. Należy jednak pamiętać, że wskaźnik zawsze na coś wskazuje.
Wskaźnik w C++ wskazujący na dowolny obiekt definiujemy tak:
typObiektu *nazwaWskaznika;
A tutaj mamy wskaźnik, którzy wskazuje na obiekt typu int:
int *wskaznik; int *wskaznik2, *wskaznik3;
Oczywiście wskaźnik może zostać również „ręcznie” przestawiony tak żeby wskazywał to co dokładnie chce programista, można to zrobić przekazując danemu wskaźnikowi referencje do jakiegoś obiektu:
int liczba = 10; //definiujemy normalną zmienną liczba do której przypisujemy 10 //teraz chcemy, żeby wskaznik wskazywał na zmienną liczba, która przechowuje liczbę 10 int *wskaznik = &liczba; //wskaźnik wskazuje teraz na zmienną liczba, tutaj zostały przekazane referencje do obiektu int
int liczba = 10; int *wsk; wsk = &liczba; //przekazanie referencji czyli ustawienie wskaźnika
Należy pamiętać, iż wskaźnik nie przechowuje nam jakiejś danej np. wyniku działania 5 * 5 czyli liczby 25 ale adres pamięci, w którym ta liczba się znajduje.
Przeglądnijmy na praktycznym przykładzie w jaki sposób działają wskaźniki w C++:
#include <iostream> using namespace std; int main() { int liczba1 = 5; int liczba2 = 10; int *wsk; //teraz wskaźnik wskazuje na jakieś śmieci cout << *wsk << endl; //jakieś śmieci int *wskaznik2 = &liczba1; //teraz wskaznik2 wskazuje na zmienną liczba1 cout << *wskaznik2 << endl; //wypisze: 5 wsk = &liczba2; //wskaźnik wskazuje teraz na zmienną liczba2 cout << *wsk << endl; //wypisze: 10 liczba2 = 15; cout << *wsk << endl; //wypisze 15 ponieważ wskaźnik cały czas wskazuje na zmienną liczba2 *wsk = 20; cout << *wsk << endl; //wypisze 20 ponieważ do adresu na który wskazuje wskaźnik przypisaliśmy 20 cout << liczba2 << endl; //wypisze 20 ponieważ wcześniej do tego adresu zapisaliśmy liczbę 20 return 0; }