Viidad Risto Heinsar Ott Madis Ozolit Mis on

  • Slides: 13
Download presentation
Viidad Risto Heinsar & Ott Madis Ozolit

Viidad Risto Heinsar & Ott Madis Ozolit

Mis on viit? • Viit on muutuja, nagu kõik teisedki • Viitmuutujasse saame salvestada

Mis on viit? • Viit on muutuja, nagu kõik teisedki • Viitmuutujasse saame salvestada mälupesa aadressi • Viitmuutuja viitab mingile teisele objektile mälus • Viitmuutujale on omane * muutuja nime ees • Viitmuutuja tüüp peab kattuma viidatava tüübiga, st: • Char viit peab viitama char muutujale • Int viit peab viitama int muutujale • jne 2013 2

Viitamisega seotud operatsioonid • int *p • &muutuja • *p • p=&muutuja • *p=55

Viitamisega seotud operatsioonid • int *p • &muutuja • *p • p=&muutuja • *p=55 • printf("%p", p) • printf("%d", *p) 2013 // viida deklareerimine // muutujalt aadressi pärimine // viidatava väärtuse poole pöördumine // viidale muutuja aadressi omistamine // viidatavale mälupesale andmete kirjutamine // viidal salvestatud aadressi trükkimine // viidataval aadressil olevate andmete trükkimine 3

Viitadest visuaalselt *p 0199 FF 8 A 2013 num 25 #include <stdio. h> int

Viitadest visuaalselt *p 0199 FF 8 A 2013 num 25 #include <stdio. h> int main(void){ int num=25, *p; p=&num; return 0; } 4

Meenutusi suurustest • char – 1 B • int – 4 B • float

Meenutusi suurustest • char – 1 B • int – 4 B • float – 4 B • double – 8 B • pointer – 4 B 2013 5

Näide 1 1 #include <stdio. h> 2 int main(void) { 3 double pi=3. 14,

Näide 1 1 #include <stdio. h> 2 int main(void) { 3 double pi=3. 14, *p; 4 p=π 5 printf("Pointerisse on salvestatud aadresst %pn", p); 6 printf("pi muutuja asub aadressiltt %pn", &pi); 7 printf("Poordudes viida kaudu muutujasse saamet %lg", *p); 8 return 0; 9 } 2013 6

Viidad ja funktsioonid • Funktsioonidega andmevahetus seniste vahenditega omab limitatsioone • Funktsioone välja kutsudes

Viidad ja funktsioonid • Funktsioonidega andmevahetus seniste vahenditega omab limitatsioone • Funktsioone välja kutsudes saame anda kaasa mäluaadresse (viitasid) • Saates funktsiooni mäluaadressi, võimaldame funktsioonil teha toiminguid mäluga, mis talle ei kuulu. Meenutame, et igal funktsioonil on oma mälu, mida teised funktsioonid ei näe. • NB! Andes funktsiooni kaasa viida, avaneb sellel võimalus muuta originaalse muutuja väärtust. 2013 7

Harjutus 1 • Lae alla http: //blue. pri. ee/tty -> prog 2 -> Koodinaited

Harjutus 1 • Lae alla http: //blue. pri. ee/tty -> prog 2 -> Koodinaited -> swap. c • Loo 2 arvu vahetamiseks funktsiooni prototüüp • Pea meeles, et määrata tuleb nii tagastatav tüüp, kui ka parameetrid! • Kirjuta vastava funktsiooni sisu • Kirjuta koodi funktsiooni väljakutse • Trüki välja muutujate aadressid nii main() funktsioonis, kui ka loodud alamfunktsioonis! Võrdle neid! 2013 8

Viidad ja massiivid • Massiivides on võimalik ringi käia viitasid kasutades. • Massiivis liikumiseks

Viidad ja massiivid • Massiivides on võimalik ringi käia viitasid kasutades. • Massiivis liikumiseks tuleb rakendada viida-aritmeetikat • NB! Tehete järjekord (sulgude kasutamine) • p=&massiiv[0] // massiivi esimese elemendi aadressi andmine viidale • p=&massiiv // sama nagu eelmine, erinev kirjapilt (soovitatav) • *(p+i) //massiivis i-nda elemendi väärtuse juurde pöördumine • p++ // pointeri viimine järgmisele massiivi elemendile 2013 9

Viidad ja massiivid visuaalselt *p int array[]={5, 3, 7, 3, 5}; int *p; p=array;

Viidad ja massiivid visuaalselt *p int array[]={5, 3, 7, 3, 5}; int *p; p=array; 48 F 9 AC 91 array[0] array[1] array[2] array[3] array[4] 5 3 7 3 5 *(p+0) *(p+1) *(p+2) *(p+3) *(p+4) 2013 10

Näide 2 1 #include <stdio. h> 2 int main(void) { 3 int array[]={5, 3,

Näide 2 1 #include <stdio. h> 2 int main(void) { 3 int array[]={5, 3, 7, 3, 5}, *p, i; 4 p=array; 5 for(i=0; i<5; i++) { 6 printf("%p, %dn", (p+i), *(p+i)); 7 } 8 return 0; 9 } 2013 11

Harjutus 2 • Aluseks võta näites 2 kirjutatud koodijupp • Täienda koodi sedasi, et

Harjutus 2 • Aluseks võta näites 2 kirjutatud koodijupp • Täienda koodi sedasi, et arvud loetakse sisse klaviatuurilt ja seejärel tehtaks väljatrükk sisestatud arvudest • Nii sisestus, kui väljastus peavad olema realiseeritud viitasid kasutades • Kui näitekoodi kirjutada ei jõudnud, leiad selle: http: //blue. pri. ee/tty -> prog 2 -> Koodinaited -> massiiv. Point. c 2013 12

Kodus • Proovi viitasid kasudes koodida. Me on neid vaja kogu semestri vältel! •

Kodus • Proovi viitasid kasudes koodida. Me on neid vaja kogu semestri vältel! • Lae alla ja tutvu põhjalikumalt pointerite näidekoodiga: http: //blue. pri. ee/tty -> prog 2 -> Koodinaited -> magic. Pointer. c • Ürita aru saada kust tulevad aadressid, kuhu pointerid viitavad ja mis nende taga peitub! 2013 13