W05_wskazniki.doc

(52 KB) Pobierz
3 Wykład: Język C

WSKAŹNIKI / ADRESY

Wskaźnik              ®              jest zmienną, która zawiera adres (wskazanie) początku dowolnego obszaru w pamięci komputera,
(np. może być to adres obszaru danych lub adres kodu programu)

 

Ogólna postać definicji wskaźnika:

typ_danych  * identyfikator wskaźnika ;

Najczęściej używane są wskaźniki „zdefiniowane” zawierające adres innej zmiennej. Taki wskaźnik zawiera informację o:

·      adresie  zmiennej w pamięci komputera

·      typie  danych przechowywanych w tej zmiennej

Przykłady definicji:

              int              *              wskaznik;              // wskaźnik na zmienną całkowitą

              double              *              wsk_liczby;              // wskaźnik na zmienną rzeczywistą

              char              *              wsk_znaku;              // wskaźnik na pojedynczy znak

              char              *              tekst;              // wskaźnik na początek łańcucha znaków

                                                            (na pierwszy znak tego łańcucha)

Można również korzystać ze wskaźników „niezdefiniowanych” (anonimowych).
Taki wskaźnik zawiera tylko informację o adresie obszaru pamięci (bez określenia typu wskazywanych danych). Definicja takiego wskaźnika ma postać:

void  * identyfikator wskaźnika ;

jest to wskaźnik na „dowolny” ciąg bajtów danych.

Ze wskaźnikami i adresami związane są dwa operatory:

· operator referencji & zwracający adres zmiennej podanej po prawej stronie tego operatora.

· operator dereferencji * identyfikujący obszar wskazywany przez wskaźnik podany po prawej stronie tego operatora.

              int liczba ;

              int *wskaźnik ;

              wskaznik = &liczba;              // przypisanie zmiennej wskaźnik
                                                                                                                              // adresu zmiennej liczba

              *wskaźnik = 10;                            // przypisanie 10 zawartości zmiennej
                                                                                                                              // wskazywanej przez wskaźnik

                                                                                                                              // tutaj równoważne liczba = 10

Arytmetyka wskaźników

Na wskaźnikach mogą być wykonywane następujące operacje:

·           przypisania ( = )

wsk = wskaznik_zmiennej_lub_obszaru_pamięci ;
(w przypadku niezgodności typów konieczne jest dokonanie konwersji typu)

·           operacje porównania  (  ==, !=, <, >, <=, >=  ):

              wsk_1 == wsk_2              // sprawdzenie czy zmienne zawierają te same adresy
              wsk_1 < wsk_2              // czy zmienna wsk_1 zawiera adres mniejszy
                            // od adresu zawartego w zmiennej wsk_2

·           operacje powiększania lub pomniejszania wskaźnika ( +, -, ++, --, +=, -= ) o liczbę całkowitą (tylko dla wskaźników zdefiniowanych)

®              powiększenie (pomniejszenie) wskaźnika o wartość N powoduje wyznaczenie adresu przesuniętego o:

N * sizeof( typ_zmiennej_wskazywanej )

bajtów w kierunku rosnących (malejących) adresów.

np. int  *x;

 

 

 

 

x

 

 

 

 

 

x+3

 

 

 

 

 

 

 

 

¯

 

 

 

 

 

¯

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

adresy ®

. . .

35

36

37

38

39

40

41

42

43

44

45

46

. . .

·           operacje odejmowania wskaźników tego samego typu ® wyznaczenie „odległości” pomiędzy dwoma adresami w pamięci.
(  odległości w sensie N * sizeof ( typ_elementu_wskazywanego )   )

 

Przykłady zmiennych wskaźnikowych:

              int              *                wsk_liczby;              // wskaźnik na liczbę typu int

              int                              tab_A[10];              // 10-cio elementowa tablica liczb int
                                             ( identyfikator tab_A  jest stałą równą adresowi
                                               pierwszego elementu tablicy o tej samej nazwie
                                              tzn.    tab_A == &( tab_A[0] )

              int              *                tab_B[10];              // 10-cio elementowa tablica wskaźników na liczby int

              int              *              ( tab_C[10] );              // jak wyżej

  ( int *)                tab_D[10];              // jak wyżej

              int                (*tab_E)[10];              ...

Zgłoś jeśli naruszono regulamin