====== Wskaźniki ====== Program demonstrujący użycie wskaźników #include int main() { int x = 100; char napis[] = "jezyki programowania\n"; int tab[5] = {100, 101, 102, 103, 104}; int *wsk1, *wsk2; // tworzymy wskaznik (do) typu int char* wsk3; wsk1 = &x; // przypisanie wartosci (adresu) printf("wsk1=&x | x=%d *wsk1=%d\n",x,*wsk1); printf("adres x | &x=%x, wsk1=%x\n",&x,wsk1); *wsk1 = 5; printf("*wsk1=5 | x=%d *wsk1=%d\n",x,*wsk1); printf("tymczasem *wsk2=%d\n",*wsk2); wsk2 = wsk1; printf("wsk2=wsk1 | *wsk2=%d\n",*wsk2); x++; printf("x++ | *wsk1=%d, *wsk2=%d, x=%d\n",*wsk1,*wsk2,x); (*wsk1)++; printf("(*wsk1)++ | *wsk1=%d, *wsk2=%d, x=%d\n",*wsk1,*wsk2,x); wsk1 = tab; // to samo co wsk1 = &tab[0] printf("teraz wsk1 pokazuje na elementy tablicy\nwsk1=tab | *wsk1=%d, *wsk2=%d, x=%d\n",*wsk1,*wsk2,x); wsk1 = wsk1 + 2; printf("wsk1=wsk1+2 | *wsk1=%d,",*wsk1); printf(" tab[2]=%d, *(tab+2)=%d\n",tab[2],*(tab+2)); wsk3 = napis + 4; printf(wsk3); return 0; } **Ćwiczenia** * przerób poniższy program tak aby do manipulowania elementami tablicy wykorzystywał wskaźniki zamiast zmiennej indeksującej ''**i**''. Program wykorzystuje pliki z poprzednich zajęć {{zajecia:jpr_2013_1:src:tab1:tab.c}} i {{{zajecia:jpr_2013_1:src:tab1:tab.h}} (z poprzednich zajęć) #include #include "tablice.h" #define MAX 100 int main() { int n,i; float tablica[MAX]; float t; printf("Ile elementow (nie wiecej niz MAX)"); scanf("%d",&n); wczytaj(tablica,n); i = 0; while(i **Ćwiczenie** * napisz funkcję o nazwie ''**zamien**'', która zamienia wartości dwóch podanych argumentów typu rzeczywistego * dodaj do plików ''**tab.h**'' i ''**tab.c**'' funkcję ''**odwroc**'', która odwraca kolejność elementów w tablicy (tak jak w przykładzie powyżej). Wykorzystaj w tym celu funkcję ''**zamien**''. Niech funkcja zwraca wskaźnik do odwróconej tablicy. ===== Wskaźnik jako argumet funkcji ===== #include #include "tab.h" #define MAX 100 void zwieksz(float *x); float *zwieksztab(float *tab,int n); int main() { int n,i; float t,tablica[MAX]; printf("Liczbe: "); scanf("%f",&t); zwieksz(&t); zwieksz(&t); zwieksz(&t); printf("Teraz liczba wynosi %f\n",t); printf("Podaj rozmiar tablicy: "); scanf("%d",&n); wczytaj(tablica,n); zwieksztab(zwieksztab(zwieksztab(tablica,n),n),n); printf("Teraz tablica wyglada tak\n"); wyswietl(tablica,n); } void zwieksz(float *liczba) { *liczba = *liczba + 1.0; } float *zwieksztab(float *tab,int n) { float *wt = tab+n; while(wt>tab) zwieksz(--wt); return tab; } ===== Zadania domowe ===== * we wszystkich funkcjach z zajęć dotyczących tablicy liczb rzeczywistych (wczytaj, wyswietl, srednia itd.) wprowadź wskaźniki zamiast indeksowania tablic zmienną całkowitą * zmień funkcję ''**pierwiastki**'' (patrz zajęcia 3) tak aby wartością zwracaną była ilość pierwiastków równania kwadratowego oraz wartości tych pierwiastków.