If you can't read please download the document
Upload
buinguyet
View
228
Download
4
Embed Size (px)
Citation preview
PokazivaPokazivai, algoritmii, algoritmi
Tomo SjekavicaTomo Sjekavica
OOujak 2012.ujak 2012.
Zatieno licencom http://creativecommons.org/licenses/by-nc-sa/3.0/hr/
http://creativecommons.org/licenses/by-nc-sa/3.0/hr/
2011/2012 Pokazivai, algoritmi 2
Creative CommonsCreative Commonso slobodno smijete:
n dijeliti umnoumnoavati, distribuirati i javnosti priopavati, distribuirati i javnosti priopavati djelo avati djelo n remiksirati preraivati djelo preraivati djelo
o pod slijedeim uvjetima:n imenovanje. Morate priznati i ozna. Morate priznati i oznaiti autorstvo djela na iti autorstvo djela na
nanain kako je specificirao autor ili davatelj licence (ali ne in kako je specificirao autor ili davatelj licence (ali ne nanain koji bi sugerirao da Vi ili Vain koji bi sugerirao da Vi ili Vae korie koritenje njegova djela tenje njegova djela imate njegovu izravnu podrimate njegovu izravnu podrku). ku).
n nekomercijalno. Ovo djelo ne smijete koristiti u . Ovo djelo ne smijete koristiti u komercijalne svrhe. komercijalne svrhe.
n dijeli pod istim uvjetima. Ako ovo djelo izmijenite, . Ako ovo djelo izmijenite, preoblikujete ili stvarate koristepreoblikujete ili stvarate koristei ga, preradu moi ga, preradu moete ete distribuirati samo pod licencom koja je ista ili slidistribuirati samo pod licencom koja je ista ili slina ovoj.na ovoj.
U sluaju daljnjeg koritenja ili distribuiranja morate drugima jasno dati do znanja licencne uvjete ovog djela. Najbolji nain da to uinite je linkom na ovu internetsku stranicu. Od svakog od gornjih uvjeta mogue je odstupiti, ako dobijete doputenje nositelja autorskog prava. Nita u ovoj licenci ne naruava ili ograniava autorova moralna prava.
Tekst licence preuzet je s http://creativecommons.org/.
http://creativecommons.org/
2011/2012 Pokazivai, algoritmi 3
Pokazivaio pokazivai su varijable koje sadre adresu neke
druge varijable
o pokaziva se oznaava sa znakom zvjezdice *ispred naziva pokazivaa
o pokazivai se najee koriste kod predaje polja funkciji kao ulazni parametar, kod koritenja raznih struktura, kod dinamike alokacije memorije, te kod rada sa datotekama
int varijabla; int *pokazivac;
deklaracija obine varijable deklaracija pokazivaa
2011/2012 Pokazivai, algoritmi 4
Tipovi pokazivaa
o vrijednost pokazivaa e uvijek biti neki cijeli broj bez obzira na koji tip varijable pokazuje jer se u njega sprema adresa te varijable
o pokazivai mogu pokazivati samo na varijable koje su istog tipa kao i tip podatka s kojim je deklariran i pokaziva
char *p; moe pokazivati samo na char varijablu
moe pokazivati samo na int varijabluint *p;
float *p;
double *p;
moe pokazivati samo na float varijablu
moe pokazivati samo na double varijablu
char a;
int a;
float a;
double a;
2011/2012 Pokazivai, algoritmi 5
Primjer s pokazivaima#include int main(){
int *p;int a = 5;printf("a = %d.\n", a);p = &a;*p = 10;printf("a = %d.\n", a);printf("*p = %d.\n", *p);printf("p = %d.\n", p);printf("&p = %d.\n", &p);system("pause");return 0;
}pokazivaci01.c
Hmm, to e mi ispisati ovaj program?
poetak
deklaracija pokazivaa p
deklaracija varijable a i priruivanje vrijednosti
5 varijabli a
pridruivanje adrese varijable a
pokazivau p
promjena vrijednosti na koju pokazuje pokaziva
p na vrijednost 10
ispisi varijable a, vrijednosti i adrese na
koju pokazuje pokazivap, te njegove adrese
kraj
2011/2012 Pokazivai, algoritmi 6
Anatomija C programa#include int main(){
int *p;int a = 5;printf("a = %d.\n", a);p = &a;*p = 10;printf("a = %d.\n", a);printf("*p = %d.\n", *p);printf("p = %d.\n", p);printf("&p = %d.\n", &p);system("pause");return 0;
}
2359130
2359131
2359132
2359133
...
2359129
2359128
2359127
2359126
2359125
2359124
2359123
2359122
2359121
2359120
2359119
...deklaracija pokazivaa koji e pokazivati na cjelobrojnu vrijednost
deklaracija cjelobrojne varijable a i pridruivanje vrijednosti varijabli a
5postavljanje da pokaziva pokazuje na varijablu a
2359124
mijenjanje vrijednosti varijable a pomou pokazivaa 10
p
a X
2011/2012 Pokazivai, algoritmi 7
Inicijalizacija pokazivaa
o prije koritenja pokazivaa obavezno je inicijalizirati pokaziva, tj. postaviti da pokazuje na neku adresu
o u sluaju da se ne zna adresu na koju treba pokazivati pokaziva treba ga incijalizirati sa NULL
int *p;int a = 5;p = &a;
nakon deklaracije pokazivaa i varijable potrebno je pokaziva inicijalizirati
A to ako trenutno ne znam na koju adresu da mi
pokazuje, a ne elim ga izbrisati jer e mi
trebati kasnije u programu?
int *p;p = NULL;
2011/2012 Pokazivai, algoritmi 8
int *p;int a = 5;p = &a;printf("%d %d", a, *p);*p = 10;printf("%d %d", a, *p);
Operator dereferenciranja *
o nakon inicijalizacije pokazivaa vrijednosti te varijable se moe pristupiti preko pokazivaa
5 5
Uili smo se da se znak zvjezdice * koristi za
mnoenje. Kako se sada isti koristi i kod pokazivaa?
Kod pokazivaa se *koristi kao unarni operator
dereferenciranja!
10 10
2011/2012 Pokazivai, algoritmi 9
Zamjena vrijednosti varijabli v0.1#include int main(){
int a = 5;int b = 7;int pom;printf("Prije zamjene:\n");printf("a = %d, b= %.d\n", a, b);pom = a;a = b;b = pom;printf("Nakon zamjene:\n");printf("a = %d, b= %.d\n", a, b);return 0;
}zamjena01.c
2011/2012 Pokazivai, algoritmi 10
Anatomija C programa#include int main(){
int a = 5;int b = 7;int pom;printf("Prije zamjene:\n");printf("a = %d, b= %.d\n", a, b);pom = a;a = b;b = pom;printf("Nakon zamjene:\n");printf("a = %d, b= %.d\n", a, b);return 0;
}
2359126
2359127
2359128
2359129
...
2359125
2359124
2359123
2359122
2359121
2359120
2359119
2359118
2359117
2359116
2359115
...
7
5
5
deklaracija cjelobrojne varijable a i pridruivanje vrijednosti varijabli
deklaracija cjelobrojne varijable b i pridruivanje vrijednosti varijabli
deklaracija cjelobrojne pomone varijable
spremanje vrijednosti varijable a u varijablu pom
spremanje vrijednosti varijable b u varijablu a
spremanje vrijednosti varijable pom u varijablu b7
5
pom
b
a
Nakon zamjene:a = 7, b = 5.
X
X
2011/2012 Pokazivai, algoritmi 11
Zamjena vrijednosti v0.2 (s funkcijom)#include void zamjena(int x, int y){
int pom;pom = x;x = y;y = pom;printf("U funkciji, nakon zamjene:\n");printf("x = %d, y = %d.\n", x, y);
}int main(){
int a = 5;int b = 7;printf("Prije pozivanja funkcije:\n");printf("a = %d, b = %d.\n", a, b);zamjena(a, b);printf("Nakon pozivanja funkcije:\n");printf("a = %d, b = %d.\n", a, b);return 0;
} zamjena02.c
2011/2012 Pokazivai, algoritmi 12
Anatomija C programa#include void zamjena(int x, int y){
int pom;pom = x;x = y;y = pom;printf("U funkciji, nakon zamjene:\n");printf("x = %d, y = %d.\n", x, y);
}int main(){
int a = 5;int b = 7;printf("Prije pozivanja funkcije:\n");printf("a = %d, b = %d.\n", a, b);zamjena(a, b);printf("Nakon pozivanja funkcije:\n");printf("a = %d, b = %d.\n", a, b);return 0;
}
2359120
2359122
2359124
2359126
...
...
2359094
2359092
2359090
2359088
2359086
2359084
2359082
2359080
2359078
2359076
...
deklaracija varijable a i pridruivanje vrijednosti
deklaracija varijable b i pridruivanje vrijednosti
5a
7bpoziv funkcije zamjena
1. parametru funkcije x se predaje vrijednost varijable a
2. parametru funkcije y se predaje vrijednost varijable b
5x
spremanje vrijednosti varijable x u varijablu pom
spremanje vrijednosti varijable y u varijablu x
spremanje vrijednosti varijable pom u varijablu ydeklaracijapomonevarijable
5pom
7y
7
5
Nakon pozivanja funkcije:a = 5, b = 7.
X
X
2011/2012 Pokazivai, algoritmi 13
Pokazivai kao parametri funkcije
o Izmijenite prethodnu funkciju tako da su ulazni parametri pokazivai koji pokazuju na realni broj, a ne obine varijable
o U glavnom programu se trebaju unositi dva realna broja s tipkovnice umjesto pridruivanja vrijednosti varijablama
Brojeve prikazati na 2 decimale.
to trebam predatifunkciji iji su parametripokazivai? Vrijednost
varijable ili njenu adresu?
2011/2012 Pokazivai, algoritmi 14
Aritmetika pokazivaato emo dobiti s prvim izrazom *p = *p * 10;?*p = *p * 10;
Prvi izraz e poveativrijednost varijable na koju pokazuje pokaziva
p za 10 puta!
p = p + 1;
Drugi izraz e poveatiadresu na koju pokazuje pokaziva p, tako da sad
pokaziva p pokazujena sljedeu adresu!
A to emo dobiti sovim drugim izrazom
p = p + 1;?
o ovisno o tipu pokazivaa vrijednost adrese na koju pokazuje e se poveati za 1, 4 ili 8.
o unarni operator dereferenciranja * ima vei prioritete od svih matematikih i logikih operacija
int, float doublechar
2011/2012 Pokazivai, algoritmi 15
Pokazivai i polja
o pristup elementima polja
Hmm, mogu li aritmetiku pokazivaa primjeniti
na polja?
Naravno, kad se kreira polje svi njegovi elementi
se spremaju jedan iza dru