Wskaźniki

Program demonstrujący użycie wskaźników

#include <stdio.h> 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ęć tab.c i tab.h (z poprzednich zajęć)

#include <stdio.h> #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<n/2) { t = tablica[i]; tablica[i] = tablica[n-i-1]; tablica[n-i-1] = t; i++; } wyswietl(tablica,n); return 0; }

Ć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 <stdio.h> #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.