Wskaźniki i tablice.
Zmienna1 Zmienna2 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Zmienna to fragment pamięci o określonym rozmiarze identyfikowany za pomocą nazwy, w którym może być przechowywana wartość określonego typu. <typ> <nazwa>; Wskaźnik to zmienna zawierająca adres pamięci komputera odpowiadający innej zmiennej. <typ> * <nazwa>;
&Zmienna1 &Zmienna2 & & Zmienna1 Zmienna2 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 = 4; Operator (adresu) & zwraca adres do zmiennej. & <nazwazmiennej> Operator (wyłuskania) * to wartość na podstawie jej adresu. * <nazwazmiennejadresowej>
&Zmienna2 & & Zmienna1 Zmienna2 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 = 4; &Zmienna1; = &Zmienna2; Operator (adresu) & zwraca adres do zmiennej. & <nazwazmiennej> Operator (wyłuskania) * to wartość na podstawie jej adresu. * <nazwazmiennejadresowej>
& & Zmienna1 Zmienna2 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 = &Zmienna1; = &Zmienna2; Operator (adresu) & zwraca adres do zmiennej. & <nazwazmiennej> Operator (wyłuskania) * to wartość na podstawie jej adresu. * <nazwazmiennejadresowej>
& & Zmienna1 Zmienna2 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 = &Zmienna1; = &Zmienna2; Zmienna1 = 5; //Ten sam wynik co * = 5; * = 3; //Ten sam wynik co Zmienna2 = 3; ++; //Zwiększa się o rozmiar typu --; //Zmniejsza się o rozmiar typu * ==? 3 * ==? 5 Zmienna1 ==? 5 Zmienna2 ==? 3
& & Zmienna1=5 Zmienna2 =4 =8 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 = &Zmienna1; = &Zmienna2; Zmienna1 = 5; //Ten sam wynik co * = 5; * = 3; //Ten sam wynik co Zmienna2 = 3; ++; //Zwiększa się o rozmiar typu --; //Zmniejsza się o rozmiar typu * == 3 * == 5 Zmienna1 == 5 Zmienna2 == 3
& & Zmienna1=5 Zmienna2=3 =4 =8 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 = &Zmienna1; = &Zmienna2; Zmienna1 = 5; //Ten sam wynik co * = 5; * = 3; //Ten sam wynik co Zmienna2 = 3; ++; //Zwiększa się o rozmiar typu --; //Zmniejsza się o rozmiar typu * == 3 * == 5 Zmienna1 == 5 Zmienna2 == 3
&Zmienna1 & & Zmienna1=5 Zmienna2=3 =8 =8 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 = &Zmienna1; = &Zmienna2; Zmienna1 = 5; //Ten sam wynik co * = 5; * = 3; //Ten sam wynik co Zmienna2 = 3; ++; //Zwiększa się o rozmiar typu --; //Zmniejsza się o rozmiar typu * == 3 * == 5 Zmienna1 == 5 Zmienna2 == 3
& & Zmienna1=5 Zmienna2=3 =8 =4 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 = &Zmienna1; = &Zmienna2; Zmienna1 = 5; //Ten sam wynik co * = 5; * = 3; //Ten sam wynik co Zmienna2 = 3; ++; //Zwiększa się o rozmiar typu --; //Zmniejsza się o rozmiar typu * == 3 * == 5 Zmienna1 == 5 Zmienna2 == 3
& & Zmienna1=5 Zmienna2=3 =8 =4 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 = &Zmienna1; = &Zmienna2; Zmienna1 = 5; //Ten sam wynik co * = 5; * = 3; //Ten sam wynik co Zmienna2 = 3; ++; //Zwiększa się o rozmiar typu --; //Zmniejsza się o rozmiar typu * == 3 * == 5 Zmienna1 == 5 Zmienna2 == 3 = + 3; (*)++; (*)--; Zmienna1 ==? 6 Zmienna2 ==? 3
&Zmienna2 & Zmienna1=5 Zmienna2=3 =16 =4 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 = &Zmienna1; = &Zmienna2; Zmienna1 = 5; //Ten sam wynik co * = 5; * = 3; //Ten sam wynik co Zmienna2 = 3; ++; //Zwiększa się o rozmiar typu --; //Zmniejsza się o rozmiar typu * == 3 * == 5 Zmienna1 == 5 Zmienna2 == 3 = + 3; (*)++; (*)--; Zmienna1 == 6 Zmienna2 == 3
&Zmienna2 & Zmienna1=6 Zmienna2=3 =16 =4 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 = &Zmienna1; = &Zmienna2; Zmienna1 = 5; //Ten sam wynik co * = 5; * = 3; //Ten sam wynik co Zmienna2 = 3; ++; //Zwiększa się o rozmiar typu --; //Zmniejsza się o rozmiar typu * == 3 * == 5 Zmienna1 == 5 Zmienna2 == 3 = + 3; (*)++; (*)--; Zmienna1 == 6 Zmienna2 == 3
&Zmienna2 & Zmienna1=6 Zmienna2=3 =16 =4 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 = &Zmienna1; = &Zmienna2; Zmienna1 = 5; //Ten sam wynik co * = 5; * = 3; //Ten sam wynik co Zmienna2 = 3; ++; //Zwiększa się o rozmiar typu --; //Zmniejsza się o rozmiar typu * == 3 * == 5 Zmienna1 == 5 Zmienna2 == 3 = + 3; (*)++; (*)--; Zmienna1 == 6 Zmienna2 == 3
&Zmienna1 &Zmienna2 & Zmienna1=6 Zmienna2=3 =16 =0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 = &Zmienna1; = &Zmienna2; Zmienna1 = 5; //Ten sam wynik co * = 5; * = 3; //Ten sam wynik co Zmienna2 = 3; ++; //Zwiększa się o rozmiar typu --; //Zmniejsza się o rozmiar typu * == 3 * == 5 Zmienna1 == 5 Zmienna2 == 3 = + 3; (*)++; (*)--; Zmienna1 == 6 Zmienna2 == 3
Funkcje: argumenty i wskaźniki Argumenty funkcji nie są przekazywane jako zmienne, tylko jako ich wartości. Funkcja nie wykonuje operacji na zmiennych podanych jako argumenty tylko i wyłącznie na ich wartościach. By możliwa była zmiana wartości zmiennej podanej jako argument należy używać jej adresu (wskaźnika) lub referencji. Deklaracja funkcji, która zmienia wartości zmiennych podanych jako parametr: void swap (int *x, int *y) main { { int tmp; tmp=*y; x=5;y=1; *y=*x; swap(&x,&y); *x=tmp;.. Return; } }
Funkcje: argumenty i wskaźniki Argumenty funkcji nie są przekazywane jako zmienne, tylko jako ich wartości. Funkcja nie wykonuje operacji na zmiennych podanych jako argumenty tylko i wyłącznie na ich wartościach. By możliwa była zmiana wartości zmiennej podanej jako argument należy używać jej adresu (wskaźnika) lub referencji. Deklaracja funkcji, która zmienia wartości zmiennych podanych jako parametr: void swap (int &x, int &y) main { { int tmp; tmp=y; x=5;y=1; y=x; swap(x,y); x=tmp;.. Return; } }
Wskaźniki i tablice Między wskaźnikami i tablicami istnieje ścisła zależność. Tablica: int a[10]; Zmienna wskaźnikowa do liczby int: int * wsk; Przypisanie adresu pierwszego elementu tablicy do wskaźnika: wsk = &a[0]; Element wsk + 1 to a[1]. * ( wsk + 2 ) to wartość a[2]. Jeśli do wsk dodamy 5 to będzie wskazywało na a[5] (wtedy wsk-1 to a[4]).
Funkcje: argumenty i wskaźniki void strcpy (char t[], char s[]) { int i =0; while((t[i]=s[i])!='\0')i++; } void strcpy (char *t, char *s) { while((*t=*s)!='\0'){ t++; s++; } }
Funkcje: argumenty i wskaźniki void strcpy (char t[], char s[]) { int i =0; while((t[i]=s[i])!='\0')i++; } void strcpy (char *t, char *s) { while((*t++=*s++)!='\0'); }
Funkcje: argumenty i wskaźniki void strcpy (char t[], char s[]) { int i =0; while((t[i]=s[i])!='\0')i++; } void strcpy (char *t, char *s) { while(*t++=*s++); }
Wskaźniki i tablice Tablice wielowymiarowe: int a[3][10]; Tablica wskaźników: int * w[3]; Wskaźnik do wskaźnika: int **wsk;
Wskaźniki niezdefiniowane, alokacja pamięci Wskaźnikiem niezdefiniowanym jest zmienna wskaźnikowa typu void: void * x; Wskaźnik taki odnosi się do dowolnego ciągu bajtów. Funkcja malloc przypisuje pamięć o danym rozmiarze do zmiennej void * malloc (size_t size); Funkcja free zwalnia pamięć przypisaną do zmiennej void free (void * pointer);
Wskaźniki niezdefiniowane, alokacja pamięci char * znaki; znaki = malloc ( 10 * sizeof ( * znaki ) ); * znaki = 'J'; * (znaki + 1) = 's'; printf ( %s,znaki); //Wyświetli Js strcpy(znaki, Janusz ); printf ( %s,znaki); //Wyświetli Janusz free ( znaki );
Wskaźniki do funkcji Funkcja może mieć również wskaźnik: typzwracany nazwafunkcji (parametry); typzwracany (* nazwawskaźnika)(parametry);
Wskaźniki do funkcji int funkcja(float x,char y) { } int (* wskaznik)(float,char); wskaznik = &funckja; int x=*wskaznik(3.2,'a');
Wskaźniki do funkcji int funkcja(float x,char y) { } int (* wskaznik)(float,char); wskaznik = funckja; int x=wskaznik(3.2,'a');