120 likes | 447 Views
Viidad. 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
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
Näide 1 #include <stdio.h> intmain(void) { double pi=3.14, *p; p=π printf("Pointerisse on salvestatudaadress\t %p\n", p); printf("pi muutujaasubaadressil\t\t %p\n", &pi); printf("Poordudesviidakaudumuutujassesaame\t %lg", *p); return 0; }
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 võimalus muuta originaalse muutuja väärtust(enam ei saadeta funktsiooni väärtuse koopiat!)
Ülesanne 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 #include <stdio.h> intmain(void) { intarray[] = {5, 3, 7, 3, 5}, *p, i; p=array; for(i=0;i<5;i++) { printf("%p, %d\n", (p+i), *(p+i)); } return 0; }
Harjutus 2 • Aluseks võta näites 2 kasutatud koodijupp • Täienda koodi sedasi, et arvud loetakse sisse klaviatuurilt ja seejärel tehtaks väljatrükk sisestatud arvudest. • Leida suurim ja vähim element koos tema aadressiga • Nii arvude väljatrüki, kui ka suurima ja vähima leidmise puhul näita ära arvude aadress mälus • Kõik pöördumised tuleb teha viitasid kasutades!
Kodus • Katseta viitade kasutamist erinevate koodijuppide peal. • Viidad on kasutusel meil kogu semestri vältel! • Lae alla ja tutvu põhjalikumalt pointerite näidekoodiga:http://blue.pri.ee/tty -> Prog2 -> Koodinaited -> pointerid.c • Ürita aru saada kust tulevad aadressid, kuhu pointerid viitavad ja mis nende taga peitub!