Wskaźniki 131
Jak już mówiliśmy, każda zmienna ma swój adres. Nawet nie znając konkretnego adresu zmiennej możesz go przypisać do wskaźnika.
Oto przykład. Załóżmy, że mamy zmienną całkowitą typu int o nazwie wiek. Żeby zadeklarować wskaźnik do przechowywania adresu tej zmiennej musisz napisać:
int *pWiek = 0;
Tak wygląda deklaracja wskaźnika pWiek mogącego przechować adres zmiennej całkowitej typu int.
pWiek jest zmienną taką jak każda inna. Kiedy deklarujesz zmienną całkowitą (np. int) to możesz w niej przechowywać wartości całkowite. Kiedy deklarujesz zmienną wskaźnikową, to możesz w niej umieścić adres jakiegoś obiektu w pamięci. W tym przypadku zmienna wskaźnikowa pWiek przechowuje adres zmiennej całkowitej typu int.
Zauważ, że zainicjowaliśmy wskaźnik pWiek wartością 0. Wskaźnik, którego wartość wynosi zero określany jest jako nuli (pusty, nie wskazujący na żaden obiekt). Jeśli nie wiesz jaki adres przypisać do wskaźnika, to przypisz mu wartość zero. Wskaźniki niezainicjowane żadną wartością określane są jako dzikie wskaźniki. Stanowią one potencjalne zagrożenie dla programu, gdyż mogą przechowywać adres dowolnej komórki pamięci (nie wiemy jakiej). Modyfikacja pamięci pod tym adresem może doprowadzić np. do zawieszenia się komputera.
Zainicjowaliśmy wskaźnik wartością 0. Musimy teraz przypisać mu adres zmiennej
wiek. Oto przykładowa sekwencja instrukcji, która to realizuje:
unsigned short int wiek = 50; // stwórz zmienna
unsigned short int * pWiek =0; // stwórz wskaźnik
pWiek = Swiek; // wstaw adres do wskaźnika
W pierwszej linii tworzymy zmienną typu unsigned short int i inicjalizujemy ją wartością 50. W drugiej linii deklarujemy pWiek jako wskaźnik na unsigned short int i inicjalizujemy go wartością 0 (nuli). O tym, że pWiek to wskaźnik, mówi nam gwiazdka umieszczona po typie zmiennej i przed jej nazwą.
Trzecia i ostatnia linia przypisuje adres zmiennej wiek do wskaźnika pWiek. Przypisaliśmy adres dzięki operatorowi adresu ( & ). Gdybyśmy zapomnieli o tym operatorze, to do wskaźnika zostałaby przypisana wartość zmiennej wiek (a nie jej adres). Oznacza to, że wskazywałby on na zupełnie inną komórkę pamięci, niż oczekiwaliśmy.
Jak już mówiliśmy, każda zmienna ma swój adres. Nawet nie znając konkretnego adresu zmiennej możesz go przypisać do wskaźnika.
Oto przykład. Załóżmy, że mamy zmienną całkowitą typu int o nazwie wiek. Żeby zadeklarować wskaźnik do przechowywania adresu tej zmiennej musisz napisać:
int *pWiek = 0;
Tak wygląda deklaracja wskaźnika pWiek mogącego przechować adres zmiennej całkowitej typu int.
pWiek jest zmienną taką jak każda inna. Kiedy deklarujesz zmienną całkowitą (np. int) to możesz w niej przechowywać wartości całkowite. Kiedy deklarujesz zmienną wskaźnikową, to możesz w niej umieścić adres jakiegoś obiektu w pamięci. W tym przypadku zmienna wskaźnikowa pWiek przechowuje adres zmiennej całkowitej typu int.
Zauważ, że zainicjowaliśmy wskaźnik pWiek wartością 0. Wskaźnik, którego wartość wynosi zero określany jest jako nuli (pusty, nie wskazujący na żaden obiekt). Jeśli nie wiesz jaki adres przypisać do wskaźnika, to przypisz mu wartość zero. Wskaźniki niezainicjowane żadną wartością określane są jako dzikie wskaźniki. Stanowią one potencjalne zagrożenie dla programu, gdyż mogą przechowywać adres dowolnej komórki pamięci (nie wiemy jakiej). Modyfikacja pamięci pod tym adresem może doprowadzić np. do zawieszenia się komputera.
Zainicjowaliśmy wskaźnik wartością 0. Musimy teraz przypisać mu adres zmiennej wiek. Oto przykładowa sekwencja instrukcji, która to realizuje:
unsigned short int wiek =50; // stwórz zmienna
unsigned short int * pWiek =0; // stwórz wskaźnik
pWiek = Swiek; // wstaw adres do wskaźnika
W pierwszej linii tworzymy zmienną typu unsigned short int i inicjalizujemy ją wartością 50. W drugiej linii deklarujemy pWiek jako wskaźnik na unsigned short int i inicjalizujemy go wartością 0 (nuli). O tym, że pWiek to wskaźnik, mówi nam gwiazdka umieszczona po typie zmiennej i przed jej nazwą.
Trzecia i ostatnia linia przypisuje adres zmiennej wiek do wskaźnika pWiek. Przypisaliśmy adres dzięki operatorowi adresu ( & ). Gdybyśmy zapomnieli o tym operatorze, to do wskaźnika zostałaby przypisana wartość zmiennej wiek (a nie jej adres). Oznacza to, że wskazywałby on na zupełnie inną komórkę pamięci, niż oczekiwaliśmy.