Viidad
description
Transcript of Viidad
ViidadRisto 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
2013
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
4
Viitadest visuaalselt
*p
0199FF8A
num 25
#include <stdio.h> int main(void){ int num=25, *p; p=# return 0;}
2013
5
Meenutusi suurustest
• char – 1B• int – 4B• float – 4B• double – 8B• pointer – 4B
2013
6
Näide 1
1 #include <stdio.h>
2 int main(void) {
3 double pi=3.14, *p;
4 p=π
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
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
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
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
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;
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
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
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