WSKAŹNIKI INDEX

Programowanie w C

Wskaźniki i tablice


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).

Ruch wskaźnika po tablicy

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.

Nazwa tablicy to też wskaźnik

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).

WSKAŹNIKI INDEX