Esittely latautuu. Ole hyvä ja odota

Esittely latautuu. Ole hyvä ja odota

Muuttujan osoite int a=1; 0xbfffea64 /* tulostetaan a:n osoite*/ printf(“%p\n”, &a); 0xbfffea68 /* tulostetaan a:n osoite + 1*/ printf(“%p\n”, &a+1); /*

Samankaltaiset esitykset


Esitys aiheesta: "Muuttujan osoite int a=1; 0xbfffea64 /* tulostetaan a:n osoite*/ printf(“%p\n”, &a); 0xbfffea68 /* tulostetaan a:n osoite + 1*/ printf(“%p\n”, &a+1); /*"— Esityksen transkriptio:

1 Muuttujan osoite int a=1; 0xbfffea64 /* tulostetaan a:n osoite*/ printf(“%p\n”, &a); 0xbfffea68 /* tulostetaan a:n osoite + 1*/ printf(“%p\n”, &a+1); /* tulostetaan a:n osoite - 1*/ printf(“%p\n”, &a-1); 0xbfffea60 muuttajan osoite saadaan &:n avulla 1 a

2 Muuttuja ’a’ muistissa printf(“%i”, sizeof a); 4 0xbfffebeb 0xbfffebe0 0xbfffebe1 0xbfffebe2 0xbfffebe3 0xbfffebe4 0xbfffebe5 0xbfffebe6 0xbfffebe7 0xbfffebe8 0xbfffebe9 0xbfffebea int:n vaatima muistitila ’a’ int:n vaatima muistitila

3 struct:n osoite struct tieto{ short a; char b; short c; } b; printf("%p\n", &b); printf("%p\n", &b+1); printf("%i\n", sizeof b); printf("%i\n", sizeof b.a+sizeof b.b+sizeof b.c); 6 0xbfffe446 0xbfffe440 5

4 osoittimet eli pointterit osoittimien määrittely & - operaatori * - operaattori Käytetään luotaessa linkitettyjä listoja, puite, graafeja ja muita tietorakenteita Funktio voi muuttaa parametrejaan Yleisin virheiden lähde

5 Osoittimien määrittäminen Osoittimet määritetään *:n avulla int i; Määritetään kokonaislukumuuttuja i Määritetään osoitin p muuttujaan i int *p = &i;

6 Osoitin esimerkkejä float *i; /* i on osoitin tyyppiin float */ int j, *k; /* j on int, k on osoitin tyyppiin int */ Osoitin voi osoittaa vain saman tyyppiseen muuttujaan kuin määrittelyssä sanottiin k=&j;i=&j;

7 * - operaattori Käänteinen &-operaattorille &-operaattori antaa muuttujan osoitteen *-operaattori antaa osoitteessa olevan muuttujan #include int main(void){ char a = 'c'; char *p=&a; printf("%c\n", a); printf("%c\n", *p); /* p:n osoittama merkki */ return 0; } c0xbffffa67 p a

8 Osoittimien käyttöä pointterin osoittamiin arvoihin voidaan myös kirjoittaa #include int main(void){ char a = 'c'; char *p=&a; printf("%c\n", *p); (*p)++; printf("%c\n", a); return 0; } ’c’ ’d’0xbffffa67 pa

9 *p=*q vs p=q #include int main(void){ char a = 'c', b='d'; char *p=&a, *q=&b; *p=*q; printf("%c, %c\n", *p, *q); p=q; printf("%c, %c\n", *p, *q); return 0; } ’c’ ’d’0xbffffa67 pa ’d’0xbffffa68 q b ’d’ 0xbffffa67 0xbffffa68 p a ’d’0xbffffa68 q b

10 Alusta osoittimet! #include int main(void){ char a = 'c'; char *p; *p='d'; printf("%c\n", *p); return 0; } c? pa

11 NULL pointteri *p ei viittaa muistiin => Segmentation fault NULL pointteri on aina erisuuri kuin muut pointterit Käytetään linkitetyssä listassa listan päättämiseen NULL-pointteriin ei voi käyttää *-operaattoria int main(void){ char *p; p=NULL; printf("%c\n", *p); return 0; }

12 Osoitin osoittimeen Osoittimet voivat osoitaa mihin tahaansa tyyppiin Voidaan määrittää osoitin osoittimeen int main(void){ int a=1; int *p=&a; int **pp; pp=&p; return 0; } 1 a 0xbfffef54 p 0xbfffef50 pp *pp *p

13 Taulukot Joukko samaa tietotyyppiä olevia alkioita #include int main(void){ int i, c[5]={0, 1, 2, 3}; int *p; for(i=0; i<5; i++) printf("%i\n", c[i]); for(p=&c[0]; p < &c[5]; p++) printf("%i\n", *p); return 0; } Taulukon koko on viisi joista neljä ensimmäistä arvoa alustetaan &c[0] osoittaa taulukon alkuun 01432 c 0xbfffef54 p &c[0] == c

14 Taulukoa taaksepäin #include int main(void){ int c[5]={0, 1, 2, 3, 4}; int *p; for(p=&c[4]; p>=c; p--) printf("%i\n", *p); return 0; } &c[4] osoittaa taulukon viimeiseen alkioon 01432 c 0xbfffef54 p

15 Osoittimien vähentäminen toisistaan Samaan taulukkoon osoittavien osoittimien erotus antaa erottavien taulukko elementtien lukumäärän int main(void){ int c[5]={0, 1, 2, 3, 4}; int *p, *p2; p=&c[1]; p2=&c[4]; printf("%i\n", p2-p); return 0; } p2-p==3 01432 c pp2

16 Moniulotteinen taulukko Esimerkki kaksiulotteisen taulukon määrittelystä float e[2][3] = {{1.0, 2.0, 3.0}, {2.0, 3.0, 4.0}};

17 Merkkijonojen ja osoittimien välinen yhteys Merkkijonot ovat taulukoita joiden alkioina ovat yksittäiset merkit #include int main(void){ char eka[]="Merkkijono"; char *p, *toka="Toinen merkkijono"; int i; for(i=0; i<sizeof eka; i++) printf("%c", eka[i]); for(p=toka; *p; p++) printf("%c", *p); return 0; } sizeof(eka)==11 sizeof(toka)==4 merkkijonon viimeinen merkki on ’\0’ tällöin *p on epätosi

18 Osoitin tietueisiin (struct) int main(void){ struct paivays{ int paiva; int kuukausi; int vuosi; }; struct paivays paiva1={15, 1, 2004}, *paiva2; paiva2=&paiva1; printf("%i.%i.%i\n", paiva1.paiva, paiva2->kuukausi, (*paiva2).vuosi); return 0; } tietueen kenttiin viitataan.:llä osoitinmuuttujan osoittaman tietueen kenttiin viitataan ->:llä

19 Funktiot Funktiolle annettavien parametrien määrää ei ole rajoitettu Paluuarvo yksi tai ei yhtään Kutsuttaessa funktio saa väliaikaiset arvot kutsuparametreistaan Niiden muutaminen ei muuta kutsuvan ohjelman arvoja

20 Muuttujan osoitteen välitys funktioon Kutsuvassa funktiossa olevia muuttaja-arvoja voidaan muuttaa välittämällä muuttujan osoite funktioon #include void funktio(int *param, int param2){ *param=param2;} int main(void){ int a=1,b=2; funktio(&a,b); printf("a=%i, b=%i\n", a, b); return 0;} sijoittaa param2:n arvon param:n osoittamaan muistipaikkaan &a on muuttujan a osoite


Lataa ppt "Muuttujan osoite int a=1; 0xbfffea64 /* tulostetaan a:n osoite*/ printf(“%p\n”, &a); 0xbfffea68 /* tulostetaan a:n osoite + 1*/ printf(“%p\n”, &a+1); /*"

Samankaltaiset esitykset


Iklan oleh Google