Viidad

13
Viidad Risto Heinsar & Ott Madis Ozolit

description

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: - PowerPoint PPT Presentation

Transcript of Viidad

Page 1: Viidad

ViidadRisto Heinsar & Ott Madis Ozolit

Page 2: Viidad

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

2013

Page 3: Viidad

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

2013

Page 4: Viidad

4

Viitadest visuaalselt

*p

0199FF8A

num 25

#include <stdio.h> int main(void){ int num=25, *p; p=&num; return 0;}

2013

Page 5: Viidad

5

Meenutusi suurustest

• char – 1B• int – 4B• float – 4B• double – 8B• pointer – 4B

2013

Page 6: Viidad

6

Näide 1

1 #include <stdio.h>

2 int main(void) {

3 double pi=3.14, *p;

4 p=&pi;

5 printf("Pointerisse on salvestatud aadress\t %p\n", p);

6 printf("pi muutuja asub aadressil\t\t %p\n", &pi);

7 printf("Poordudes viida kaudu muutujasse saame\t %lg", *p);

8 return 0;

9 }

2013

Page 7: Viidad

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.

2013

Page 8: Viidad

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!

2013

Page 9: Viidad

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

2013

Page 10: Viidad

10

Viidad ja massiivid visuaalselt

2013

*p

48F9AC91

array[0]

5

array[1]

3

array[2]

7

array[3]

3

array[4]

5

*(p+2)*(p+1)*(p+0) *(p+3) *(p+4)

int array[]={5,3,7,3,5};int *p;p=array;

Page 11: Viidad

11

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, %d\n", (p+i), *(p+i));

7 }

8 return 0;

9 }

2013

Page 12: Viidad

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

2013

Page 13: Viidad

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!

2013