Wskaźniki w C++, referencje. Ściągawka

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++.

Wskaźniki w C

Wskaźnik. Foto: moje, marzec 2018

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:

Wskaźniki i operatory

Należy dodatkowo uważać na NULL-owe wskaźniki. Próba dobrania się do ich wartości poskutkuje wyjątkiem:

Wskaźniki w C++ na NULL

Wskaźniki w C++

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:

Referencja

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:

Co zawiera referencja

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:

Wskaźniki klasowe

Wskaźniki klasowe

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.

Przydatny wpis? Postaw mi kawę :)