Wskaźniki, to bardzo pomocne narzędzie.
Wskaźnikiem moźna pokazywać na obiekty tego samego typu, lub klasy (np. int). Deklaracja takiego wskaźnika wygląda następująco:
int * wskaznik_na_typ_int;
Gwiazdka tworzy zmienną jaką wskaźnik.
A co takiego ciekawego przechowuje wskaznik_na_typ_int?
A no ADRES! Dokładnie, wskaźniki wskazują na adresy.
Jeśli chcemy uzyskać wartość z pamięci na którą wskazuje wskaźnik należy użyć dereferencji ( * )
Dobrze by było, by wskaźnik na coś wskazywał. Może wskazywać na istniejącą już zmienną:
int zmienna = 5;
int * wsk = &zmienna;
Tutaj z pomocą przyszła nam referencja ( & ), która zwraca adres pamięci zmiennej.
Oczywiście nie jest to jedyne użycie.
Drugim, znacznie ważniejszym użyciem, jest używanie wskaźniów z operatorami new i delete.
new Alokuje pamięć na stercie (w trakcie działania programu znajduje sobie pamięć, nie zajmuje jej od początku do końca), a delete ją zwalnia. Zawsze należy pamiętać o zwalnianiu pamięci, inaczej dojdzie do wycieków!
Użycie:
int * wsk = new int(10);
std::cout << *wsk << endl;
std::cout << wsk << endl;
Pierwsze odwołanie do obiektu cout zwróci nam wartość "10", a drugie wyświetli adres pamięci na której rezyduje nasz wsk.
Wskaźniki pozwalają w ten sposób na dynamiczne alokowanie pamięci.
Oczywiście umożliwiają też tworzenie dynamicznych tablic:
int * wsk = new int[10];
delete [] wsk;
Tworzenie dynamicznych wielowymiarowych tablic jest troszke trudniejsze - należy dodawać kolejne gwiazdki:
int indeks = 10;
int MaxY = 10;
int ** tab = new int[x];
for(int x = 0; i < indeks; ++i)
*tab[x] = new int[MaxY];
tab[2][2] = 15;
for(int x = 0; i < indeks; ++i)
delete tab[x];
delete [] tab;
Możliwe jest tworzenie takzwanych zmiennych referencyjnych - są one najczęściej używane w funkcjach do zmieniania wartości argumentów nie działając na ich kopiach.
int x = 5;
int & ref = x;