Wskaźniki
Transkrypt
Wskaźniki
Wskaźniki • • • • • • Co to jest wskaźnik? Deklaracja wskaźnika Użycie wskaźników Arytmetyka na wskaźnikach Wskaźniki a tablice Ciąg znaków - typ char* 85 Wskaźniki Wskaźnik to zmienna (tzw. zmienna wskaźnikowa) przechowująca adres pamięci. Wskaźniki służą najczęściej do przechowywania adresów zmiennych. Typ wskazywany to typ danej znajdującej się pod adresem wskazywanym przez wskaźnik. 86 Deklarowanie wskaźnika int a; float x; zmienne typów prostych char znak; int *pa; float *px; char *pznak; zmienne wskaźnikowe (wskaźniki) 87 Użycie wskaźników Operator adresowania & zwraca adres zmiennej. Operator dereferencji (wyłuskania) wskazywaną przez wskaźnik. * zwraca wartość int (32-bit) int a, b; int *wsk; wsk a wsk = &a; b = a; b = *wsk; ten sam efekt 88 Użycie wskaźników int a, b; deklaracje zmiennych int *pa; deklaracja wskaźnika int *pb = &b; inicjalizacja wskaźnika pb wskazuje b a = 5; b = 10; przypisanie zmiennych pa = &a; pobranie adresu zmiennej pa wskazuje a pb = pa; przypisanie wskaźników pb wskazuje a b = *pb; wyłuskanie spod wskaźnika b ma wartość 5 *pa = 7; przypisanie wartości zmiennej wskazywanej a ma wartość 7 89 Arytmetyka na wskaźnikach float A[10]; float *pa = &A[5]; przesunięcie w pamięci o 1*4 bajty pa++; Inkrementacja wskaźnika &A[6] pa += 3; Dodanie wartości do wskaźnika lub &A[9] pa = pa + 3; (analogicznie: dekrementacja i odjęcie wartości od wskaźnika) float *pa1, *pa2; pa1 = &A[9]; pa2 = &A[1]; wyrażenie pa1 – pa2 zwraca wartość 8 W przypadku wskaźników zawierających adresy elementów tablicy, różnica wskaźników jest równa liczbie elementów zawartych między wskaźnikami (różnica indeksów elementów tablicy). 90 Wskaźniki a tablice int i; int A[10]; for (i = 0; i < 10; i++) A[i] = i; for (i = 0; i < 10; i++) *(A+i) = i; wersja tablicowa (indeksowanie) wersja wskaźnikowa (arytmetyka na wskaźnikach) 91 Wskaźniki a tablice int i, j; int M[5][5]; for (i = 0; i < 5; i++) for (j = 0; j < 5; j++) M[i][j] = i*j; for (i = 0; i < 5; i++) for (j = 0; j < 5; j++) *(*(M+i)+j) = i*j; wersja tablicowa (indeksowanie) wersja wskaźnikowa (arytmetyka na wskaźnikach) 92 Wskaźniki a tablice Nazwa tablicy jest adresem jej pierwszego elementu w pamięci (wskaźnikiem na pierwszy element). A &A[0] A+1 &A[1] A+2 &A[2] int A[10]; int *pa = &A[0]; pa pa+1 pa+2 A[0] A[1] A[2] ... ... ... ... A[7] A[8] A[9] 93 Ciąg znaków - typ char* char napis1[6] = { ’A’, ’N’, ’S’, ’I’, ’ ’, ’C’ }; char napis2[7] = ”ANSI C”; A N S I C ’\0’ strcpy(napis2, ”Hello”); char napis3[] = ”ANSI C”; char *napis4 = ”ANSI C”; napis4 = ”ANSI C”; 94