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
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]; ...
klamer87