Prosty przykład:
int main(){ int liczba = 7; std::cout<<"Adres liczba"<<&liczba<<std::endl; int* wsk = &liczba // zmienna wsk przechowuje adres liczba std::cout<<"Pod adresem"<<wsk<<"jest liczba"<<*wsk<<std::endl; *wsk = 15; std::cout <<"Teraz liczba = "<<liczba<<std::endl; }do odczytania adresów zmiennych służy operator &.
wyjaśnijmy linijkę
int* wsk = &x // zmienna wsk przechowuje adres liczbatutaj na lewo od gwiazdki znajduje się identyfikator typu int , dlatego zmienna wsk może przechowywać adresy liczb typu int. Typem zmiennej wsk jest int*
Skoro mamy wskaźnik możemy na niej wykonać dwie rzeczy.
1.uzyskać wartość obiektu na którą wskazuje wskaźnik służy do tego operator *
2.zmienienie jej wartości kod:
int x = 0 , y =2; int* wsk = &x; p = &y
Wskaźniki stałe to wskaźniki które zawsze mają te samą wartość (zawsze wskazują ten sam obiekt) wskaźniki stałem muszą być zainicjowane adresem obiektu od razu przy tworzeniu.
int x =0; int* const wsk = &x; // wsk jest stalym wskaźnikiem na xWskaźniki na stałą to wskaźniki umożliwiające jedynie odczytanie stanu obiektu
int x =0; const int* wsk = &x; // wsk jest wskaźnikiem na stałąi dodatkowo można utworzyć stały wskaźnik na stałą
int x = 0; const int* const wsk = &x;
Wskaźniki na wskaźniki
int x = 0; int* wsk = &x; int** wsk2 = &wsk;
Void*
jest to specjalny typ wskaźników który charakteryzuje się tym że można przypisać mu wartość wskaźnika dowolnego typu
int x = 0; int* wsk = &x; // wsk wskazuje na x void* wsk2 = wsk; //w wsk2 jest wartość wsk czyli adres x
taki kod służy w C do przekazywania do funkcji argumentów dowolnego typu nie jest to zbyt ładne prawda ?
dlatego w swoim kodzie nigdy nie używaj void* w c++ slużą do tego szablony
Wskaźnik zerowy
jest to wskaźnik o wartości 0 oznacza to że nie wskazuje on na żaden obiekt można też używać NULL
Tablice a wskaźniki
jeżeli wykonamy taki kod
int tab[2] = {0}; std::cout<<tab<<std::endl; std::cout<<&tab[0]<<std::endl;
dostaniemy ten sam adres
więc możemy powiedzieć że nazwa tablicy może być traktowana jak wskaźnik na jej pierwszy element
dalej
int tab[2] = {0,1}; int* wsk = tab; std::cout<<wsk<<std::endl; std::cout<<*wsk<<std::endl; std::cout<<wsk[1]<<std::endl;po koleji
w pierwszej linijce dostaniemy ten sam adres jaki byśmy zobaczyli gdybyśmy przesłali tab
w następnej zobaczymy 0 czyli wartość pierwszego elementu
a w następnej wartość drugiego elementu czyli 1;)
czyli podsumowując
Wskaźników można używać jak nazw tablic , a nazw tablic jak wskaźników
Użytkownik DarkGL edytował ten post 03.08.2010 16:05