118
ROZDZIAŁ 17. WSKAŹNIKI
Zwróćmy uwagę na wywołanie func(kz);. Należy pamiętać, by do funkcji przekazać adres zmiennej a nie samą zmienną. Jeśli byśmy napisali func(z) ; to funkcja starałaby się zmienić komórkę pamięci o numerze 3. Kompilator powinien ostrzec w takim przypadku o konwersji z typu int do wskaźnika, ale często kompiluje taki program pozostając na ostrzeżeniu.
Nie gra roli czy przy deklaracji funkcji jako argument funkcji ]M>duinv wskaźnik czy tablicę (z |xxlanym rozmiarem lub nie), np. poniższe deklaracje są identyczne:
void func(int ptr[]); void func(int *ptr);
Można przyjąć konwencję, że deklaracja określa czy funkcji przekazujemy wskaźnik do pojedynczy argument czy do sekwencji, ale równie dobrze można za każdym razem stosować gwiazdkę.
Ważne jest. aby przy posługiwaniu się wskaźnikami nigdy nie próbować odwoływać się do komórki wskazywanej przez wskaźnik o wartości NULŁ lub niezainicjowany wskaźnik! Przykładem nieprawidłowego kodu, może być np.:
int *wsk;
printf ("zawartość komorki: Xd\n", *(wsk)); /• Błąd • /
wsk =0; /• 0 w kontekście wskaźników oznacza wskaźnik NULL •/
printf ("zawartość komorki: %d\n", *(wsk)); /• Błąd •/
Należy również uważać, aby nie odwoływać się do komórek poza przydzieloną pamięcią.
np.:
int tab[) ■ { 0, 1, 2 >; tab[3) - 3; /• Błąd •/
Pamiętaj też. że możesz być rozczarowany używając operatora sizeof, podając zmienną wskaźnikową. Uzyskana wielkość będzie wielkością wskaźnika, a nie wielkością typu użytego podczas deklarowania naszego wskaźnika. Wielkość ta będzie zawsze miała taki sam rozmiar dla każdego wskaźnika, w zależności od kompilatora, a także* docelowej platformy. Zamiast tege> używaj: sizeof(0waka£nik). Przykład:
char *zmienna;
int a = sizeof zmienna; /* a wynosi np. 4, tj. sizeof(char*) */ a * sizeof(char*); /* robimy to samo, co wyżej */
a ■ sizeof *zmienna; /• zmienna a ma teraz przypisany rozmiar
pojedyńczego znaku, tj. 1 •/ a * sizeof(char); /* robimy to samo, co wyżej •/
Analizując kody źródłowe programów często można spotkać taki oto zapis:
void ‘wskaźnik = NULL; /* lub = 0 •/