ANSI C 7

ANSI C 7



5 WSKAŹNIKI I TABLICE

Ćwiczenie 5.1. Tak jak została napisana, funkcja getint traktuje znaki + i —» P° których nie następuje cyfra, jako poprawne reprezentacje zera. Zmień tę funkcję tak, by oddawała je z powrotem na wejście.

Ćwiczenie 5.2. Napisz funkcję getfloat - zmiennopozycyjny odpowiednik funkcji getint. Jakiego typu wartość powinna zwracać getfloat jako swoją wartość funkcyjną?


Wskaźniki i tablice

W języku C występuje ścisła zależność między wskaźnikami i tablicami, ścisła do tego stopnia, że wskaźniki i tablice powinny być rozpatrywane jednocześnie. Każdą operację, którą można przeprowadzić za pomocą indeksowania tablicy, można również wykonać za pomocą wskaźników. Wersja wskaźnikowa będzie na ogół szybsza, ale - zwłaszcza dla początkujących - trochę trudniejsza do zrozumienia.

Deklaracja

int a[10];

definiuje tablicę a o rozmiarze 10, a więc blok dziesięciu kolejnych obiektów nazwanych a[0], a[1],a[9].

a:

a[0] a (11    a 19]

Zapis a[i] oznacza i-ty element tablicy a. Niech pa będzie wskaźnikiem do obiektów całkowitych, zadeklarowanym jako

int *pa;

wówczas przypisanie pa = &a[0];

ustawi pa tak, aby wskazywał na zerowy element tablicy a; wskaźnik pa zawieri więc adres elementu a[0].

pa:


—pewe-r^e-d—by

Teraz przypisanie


Mi siol

x = ♦pa;

skopiuje zawartość a[0] do x.

Jeśli pa wskazuje na pewien element tablicy, to - z definicji - pa+1 wskazuje na element następny, pa+i odnosi się do i-tego elementu po pa, a pa-i do i-tego elementu przed pa. Jeżeli więc pa wskazuje na a[0], to

♦(pa+1)

odnosi się do zawartości a[1 J; pa+i jest adresem a[i], a *(pa+i) jest zawartością a[i].


Te spostrzeżenia są prawdziwe niezależnie od typu lub rozmiaru elementów tablicy a. Znaczenie operacji „dodawanie 1 do wskaźnika”, a szerzej - całej arytmetyki na wskaźnikach, jest oparte na tym, że pa+1 wskazuje następny obiekt, a pa+i odnosi się do obiektu oddalonego od pa o i takich obiektów.

Ścisła odpowiedniość między indeksowaniem i arytmetyką na wskaźnikach jest oczywista. Wartością zmiennej lub wyrażenia typu tablica jest z definicji adres zerowego elementu tej tablicy. Zatem po przypisaniu

pa = &a[0J;

pa oraz a mają identyczne wartości. Ponieważ nazwa tablicy reprezentuje położenie jej elementu początkowego, przypisanie pa=&a[0] można także napisać w postaci

pa = a;

Większą niespodzianką, przynajmniej na pierwszy rzut oka, będzie to, że odwołanie do a[i] można zapisać jako *(a+i). W języku C wyrażenie a[i] przy obliczaniu jest przekształcane bezpośrednio na *(a+i) - obie te formy są równoważne. Po zastosowaniu operatora adresu & do obu form widać, że &a[i] oraz a+i także są identyczne: a+i

jest adresem elementu oddalonego o i elementów od a. A z drugiej strony, jeśli pa jest wskaźnikiem, to w wyrażeniach może wystąpić z indeksem: pa[i] jest równoważne 1 *(pa+i). Podsumowując, wyrażenie w postaci „tablica i indeks” jest równoważne z wyrażeniem w postaci „wskaźnik i przesunięcie” (ang. offset).

137


Wyszukiwarka

Podobne podstrony:
ANSI C 7 5 WSKAŹNIKI I TABLICE oba zapisy a[3][4] i b[31[4] są poprawnymi odwołaniami do pojedyncz
ANSI C 2 5 WSKAŹNIKI I TABLICE _______—— Ćwiczenie 5.16. Dodaj opcję -d (kolejność słownikowa) spr
ANSI C 6 5 WSKAŹNIKI I TABLICE _ Obrazowo wygląda to tak: 5 2 WSKAŹNIKI I ARGUMENTY FUNKCJI w miej
ANSI C 1 5 WSKAŹNIKI I TABLICE Stałe napisowe chyba najczęściej występują jako argumenty funkcji,
ANSI C 0 5 WSKAŹNIKI I TABLICE -------- ten program tak, aby najlepiej wykorzystywał dostępną mu p
IMG?39 (2) fi 4 prawdopodobna. Konkludując można mieć bardzo duże wątpliwości, czy ten czyn tak jak
CCF20090704098 200 Część II seria tak, jak zostały przedstawione w czwartej Medytacji, musielibyśmy
DSC03612 (2) 9. Płyny do pracowni histopatologicznej przesyłamy A. w postaci niezmienionej (tak jak
ANSI C 4 WSKAŹNIKI I TABLICE Wskaźnik jest zmienną, która zawiera adres innej zmiennej. W języku C
ANSI C 5 5 WSKAŹNIKI I TABLICE Jeżeli wskaźnik ip wskazuje na zmienną całkowitą x, to *ip może wys
ANSI C 8 5 WSKAŹNIKI I TABLICE Między nazwą tablicy a wskaźnikiem jest jednak istotna różnica, o k
ANSI C 9 5 WSKAŹNIKI I TABLICE______—-- alloc i afree jest stosem lub listą LIFO (ang. last-in, fi
ANSI C 0 5 WSKAŹNIKI I TABLICE o specjalną wartość wskaźnikową. Stała NULL jest zdefiniowana w
ANSI C 2 5 WSKAŹNIKI I TABLICE _______^ operator przyrostkowy ++ nie zmieni t, dopóki nie zostanie
ANSI C 3 5 WSKAŹNIKI I TABLICE możliwości są zawarte w funkcjach: getline (rozdz. 1 i 4), atoi, it
ANSI C 4 5 WSKAŹNIKI I TABLICE #define MAXLEN 1000 /* maks. długość wiersza wejściowego */ int get
ANSI C 5 5 WSKAŹNIKI I TABLICE /* swap: zamień miejscami v[i] i v[j] */ void swap(char *v[], int i
ANSI C 6 5 WSKAŹNIKI I TABLICE_______—- Oprócz tej różnicy w zapisie tablicę dwuwymiarową traktuj

więcej podobnych podstron