Wskaźniki w C++ są chyba najbardziej problematycznym elementem tego języka dla początkujących programistów. Przygotowałam krótką ściągawkę z najważniejszymi informacjami na temat wskaźników, referencji i klas w C++.
Czym są wskaźniki w C++?
Wskaźnik – zmienna, której wartością jest adres w pamięci. Można mu przypisać wskazanie na adres w pamięci – wtedy wskaźnik „wskazuje” na tą pamięć.
W pracy ze wskaźnikami potrzebne są dwa operatory:
*
– operator wyłuskania, pobrania wartości wskaźnika&
– operator pobrania adresu.
Zobaczmy w poniższym kodzie, co jest wypisane w przypadku próby wypisania wartości wskaźników i zmiennych. Wartość wskaźnika można zmieniać, co również widać w poniższym przykładzie:
Należy dodatkowo uważać na NULL-owe wskaźniki. Próba dobrania się do ich wartości poskutkuje wyjątkiem:
Czym jest referencja?
Referencja to bezpośredni adres pamięci. Raz ustawiona referencja nie może zostać zmieniona w programie. Jej obsługą zajmuje się kompilator. W zamian za to, po ustawieniu, można używać jej jak zwykłej zmiennej. Referencja jest jakby „synonimem” zmiennej, inną nazwą na tę samą zmienną, co widać na przykładzie:
Takie zachowanie referencji jest przydatne, jeśli chcemy np. wewnątrz funkcji zmieniać jakiś obiekt – ale o tym napiszę w osobnym artykule.
W przypadku używania referencji możemy obyć się bez wszystkich tych gwiazdek i ampersandów (*
, &
), które trzeba używać w pracy ze wskaźnikami. Kod bardziej przypomina ten znany z Javy czy C#. Przykład:
Wskaźniki w C++ – typu klasowego i zmienne typu klasowego
Jeżeli chcemy utworzyć wskaźnik na bardziej skomplikowany obiekt niż typ prosty (np. int
), są dwa sposoby:
- zmienna typu klasowego – nowa instancja obiektu, przypisana do zmiennej. Po wyjściu z zakresu bloku (ograniczonego klamrami
{}
) obiekt ten zostanie automatycznie usunięty. - wskaźnik typu klasowego – tworzony przez operator new. Wyjście poza zakres bloku nie spowoduje automatycznego usunięcia tych obiektów. Dlatego obowiązkowo trzeba zwolnić pamięć operatorem delete!
Jak to wygląda w praktyce, można zobaczyć na przykładzie:
Jeszcze jakieś wątpliwości? Odsyłam do bardzo fajnego artykułu, gdzie można dodatkowo zgłębić temat: https://www.p-programowanie.pl/cpp/wskazniki/.
Kod wszystkich przykładów jest do pobrania tu: https://bitbucket.org/snippets/d9k/ge8jyb.