130 likes | 339 Views
Viidad. Risto Heinsar & Ott Madis Ozolit. 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:
E N D
Viidad Risto Heinsar & Ott Madis Ozolit
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
Viitamisega seotud operatsioonid • int *p // viida deklareerimine • &muutuja // muutujalt aadressi pärimine • *p // viidatava väärtuse poole pöördumine • p=&muutuja // viidale muutuja aadressi omistamine • *p=55 // viidatavale mälupesale andmete kirjutamine • printf("%p", p) // viidal salvestatud aadressi trükkimine • printf("%d", *p) // viidataval aadressil olevate andmete trükkimine
Viitadest visuaalselt #include <stdio.h> intmain(void){ intnum=25, *p; p=# return 0; } *p0199FF8A num 25
Meenutusi suurustest • char – 1B • int – 4B • float – 4B • double – 8B • pointer – 4B
Näide 1 1 #include <stdio.h> 2intmain(void) { 3double pi=3.14, *p; 4 p=π 5printf("Pointerisse on salvestatudaadress\t %p\n", p); 6printf("pi muutujaasubaadressil\t\t %p\n", &pi); 7printf("Poordudesviidakaudumuutujassesaame\t %lg", *p); 8return 0; 9}
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.
Harjutus 1 • Lae alla http://blue.pri.ee/tty -> prog2 -> 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!
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
Viidad ja massiivid visuaalselt *p48F9AC91 intarray[]={5,3,7,3,5}; int*p; p=array; array[0]5 array[1]3 array[2]7 array[3]3 array[4]5 *(p+0) *(p+1) *(p+2) *(p+4) *(p+3)
Näide 2 1 #include <stdio.h> 2 intmain(void) { 3 intarray[]={5,3,7,3,5}, *p, i; 4 p=array; 5 for(i=0;i<5;i++){ 6 printf("%p, %d\n", (p+i), *(p+i)); 7 } 8 return 0; 9 }
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 -> prog2 -> Koodinaited -> massiivPoint.c
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 -> prog2 -> Koodinaited -> magicPointer.c • Ürita aru saada kust tulevad aadressid, kuhu pointerid viitavad ja mis nende taga peitub!