Jeśli mamy definicje wskaźnika i tablicy:
int *wskaznik; int tablica[10];to instrukcja postaci:
wskaznik = &tablica[n]ustawia wskaźnik na elemencie tablicy o indeksie n. Wszystko się zgadza, ponieważ ten wskaźnik umożliwia pokazywanie obiektów typu int, a nasza tablica jest złożona z właśnie takich elementów.
Instrukcja ustawiająca wskaźnik na zerowym elemencie (na jej początku):
wskaznik = &tablica[0];jest równoważna takiemu zapisowi:
wskaznik = tablica;Jest to zgodne z bardzo ważną zasadą, która mówi, że:
Nazwa tablicy jest równocześnie adresem jej początku (zerowego elementu).
Ułatwienie pracy z tablicami w związku z zastosowaniem wskaźników wiąże się z mechaniką ruchu wskaźnika. Pokażmy to na przykładzie. Jeśli omawiany wyżej wskaźnik ustawimy na żądany element tablicy, np. w ten sposób:
wskaznik = &wskaznik[4]to, aby go przesunąć tak, by odwoływał się do następnego elementu tej tablicy wystarczy do niego dodać 1 w ten sposób:
wskaznik = wskaznik + 1;albo krócej:
wskaznik++;Przepis na przesunięcie wskaźnika o n elementów w górę tablicy dany jest kodem:
wskaznik += n;a w dół tablicy
wskaznik -= n;
Dodanie do wskaźnika jakiejś liczby całkowitej powoduje, że pokazuje on tyleż elementów dalej. Podobnie odjęcie jakiejś liczby całkowitej od wskaźnika, przestawia go o tyle elementów bliżej początku. Jest to niezależne od typu elementów tablicy.
Kompilator języka C/C++ przy pracy z tablicami troszczy się sam o indeksowanie wskaźnika. W przypadku tablicy znakowej każdy element to 1 bajt. Przy tablicy złożonej z liczb typu int, każdy jej element ma długość 2 bajtów (w IBM PC). My jednak nie musimy martwić się o rozmiar poszczególnych elementów tablicy; kompilator wie ile bajtów trzeba przeskoczyć do następnego elementu. Wie to z definicji wskaźnika, który służy do identyfikowania obiektów danego typu.
W pliku wsk02.c znajdziemy parę ciekawych rzeczy. Definiujemy tam kilka zmiennych i dwa wskaźniki. Pierwszy z nich - znak - jest to wskaźnik do obiektów typu char, drugi o nazwie liczba do obiektów typu int. Oprócz tego zdefiniowaliśmy dwie tablice: znakową - tekst oraz liczb całkowitych - lista. Posłużą nam one do uwidocznienia powiązań pomiędzy wskaźnikami a tablicami.
W języku programowania C/C++ tablica jest zdefiniowana, jako stały wskaźnik do jej początku.
Wyjaśnijmy to trochę. Na początku programu funkcją strcpy wprowadzamy do tablicy tekst pewną stałą (literał łańcuchowy), tak abyśmy mieli z czym dalej pracować. Następnie przypisujemy pierwszy element tablicy (o indeksie zero) zmiennej jeden; jest to pierwszy znak z naszego stringa. Zgodnie z tym co sobie przed chwilą powiedzieliśmy, możemy to samo zrobić używając wskaźnika - nazwy tablicy poprzedzonej gwiazdką. Rezultat dwóch przypisań jest identyczny; zmienna jeden oraz dwa zawiera ten sam znak 'T' - pierwszy znak z tablicy. Należy zwrócić uwagę, że zapis
dwa = *tekst[0]byłby niepoprawny, ponieważ gwiazdka zastępuje tutaj nawiasy kwadratowe. Reasumując poniższe porównanie jest prawdziwe.
tekst[n] == *(tekst + n);
Reszta programu traktuje o problemach, o których już sobie wyżej powiedzieliśmy. Nie powinnieneś mieć zatem kłopotów z jego rozszyfrowaniem (zwłaszcza, że umieszczone są w nim komentarze).