115
Podsumowując, różne wskaźniki to różne typy i nie należy beztrosko rzutować wyrażeń pomiędzy różnymi typami wskaźnikowymi, bo grozi to nieprzewidywalnymi błędami.
Czasami zdarza się, że nic wiemy, na jaki typ wskazuje dany wskaźnik. W takich przypadkach stosujemy typ void*. Sam wid nie znaczy nic, natomiast void* oznacza •“wskaźnik na obiekt w pamięci niewiadomego typu”. Taki wskaźnik możemy potem odnieść do konkretnego typu danych (w języku C++ wymagane jest do tego rzutowania). Na przykład, funkcja inalloc zwraca właśnie wskaźnik za pomocą void*.
W języku C do wskaźników można dodawać lub odejmować liczby całkowite. Istotne jest jednak, że dodanie do wskaźnika liczby dwa nie spowoduje przesunięcia się w pamięci komputera o dwa ł>ajty. Tak naprawdę przesuniemy się o 2*rozmiar zmiennej. Jest to bardzo ważna informacja! Początkujący programiści popełniają często dużo błędów, związanych z nieprawidłową arytmetyką wskaźników.
Zobaczmy na przykład:
int *ptr;
int a[] = {1, 2, 3, 5, 7>; ptr ■ &a[0];
ptr
1
Rysunek 17.2: Wskaźnik wskazuje na pierwszą komórkę pamięci
Otrzymujemy następującą syt nację:
Gdy wykonamy
ptr +■ 2;
1 |
2 |
3 |
5 |
7 |
Rysunek 17.3: Przesunięcie wskaźnika na kolejne komórki
wskaźnik ustawi się na trzecim elemencie tablicy.