1 / 13

Viidad

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:

madison
Télécharger la présentation

Viidad

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Viidad Risto Heinsar & Ott Madis Ozolit

  2. 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

  3. 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

  4. Viitadest visuaalselt #include <stdio.h> intmain(void){ intnum=25, *p; p=&num; return 0; } *p0199FF8A num 25

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

  6. Näide 1 1 #include <stdio.h> 2intmain(void) { 3double pi=3.14, *p; 4 p=&pi; 5printf("Pointerisse on salvestatudaadress\t %p\n", p); 6printf("pi muutujaasubaadressil\t\t %p\n", &pi); 7printf("Poordudesviidakaudumuutujassesaame\t %lg", *p); 8return 0; 9}

  7. 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.

  8. 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!

  9. 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

  10. 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)

  11. 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 }

  12. 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

  13. 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!

More Related