Ohjelmointi 2 Jussi Pohjolainen TAMK» Tieto- ja viestintäteknologia
Tietotyypeistä C++ - kielessä useita tietotyyppejä Kirjaimet: char, wchar_t Kokonaisluvut: short, int, long Liukuluvut: float, double Totuusarvo: bool
Tyyppien arvoalueet C++-kielessä on otsikkotiedosto climits, jossa on määritelty tietotyyppien ylä- ja alarajat vakioina. Vakiot SHRT_MAX, SHRT_MIN, INT_MAX, INT_MIN etc. http://www.cplusplus.com/reference/clibrary/ climits/ Esimerkki käytöstä: limits.cpp (moodle)
Vakiotyypit Lisämäärellä const muuttuja muutetaan vakioksi const double PI = 3.145; Tällöin muuttujan arvoa ei voida ohjelmassa enää vaihtaa Tämä ei siis onnistu PI = 2.2;
Lisää tyypeistä Perustietotyyppien lisäksi C++-kielessä on Tietue- ja luokkatyyppejä struct, union ja class Johdettuja tyyppejä taulukot, osoittimet ja viittaukset Tänään katsotaan structia, unionia ja osoittimia.
Tietue- ja luokkatyypit Tietuetyyppi on koosteinen tietotyyppi, joka sisältää tietokenttiä. Tietokentät voivat olla perustietotyyppejä tai johdettuja tyyppejä Ohjelmoijan itse määrittelemä tietotyyppi! Varatut sanat struct ja union Luokkatyyppiä opiskellaan olio-ohjelmoinnin yhteydessä jätetään käsittelemättä tässä vaiheessa
Tietuetyypeistä Tietuetyypit ovat ohjelmoijan itsensä määrittelemiä tyyppejä Kokonaisluvun määritys: int kokonaisluku; Päivämäärän määritys: PVM paivamaara; Nyt PVM on ohjelmoijan luoma tietotyyppi!
struct Tietuetyyppi kootaan tietokentistä: struct PVM { }; int pp; int kk; int vv; Esimerkki: struct.cpp (moodle)
struct-alustus Tietue voidaan alustaa määrittelyn yhteydessä: DATE mydate = {2008, 12, 1}; Varaa tässä tapaukselle kolmelle kokonaisluvulle tilaa muistista Esimerkki: struct2.cpp
union Union on tietuetyyppi, jossa tietueen kentät jakavat saman muistialueen. union PVM { }; int pp; int kk; int vv; Todella harvoin käytetty, pärjätään ilmankin.
Osoittimet 2007-08-21, Jussi Pohjolainen
Muistialue ja muuttujat Keskusmuisti (ram) 1. int a = 1; 2. int b = 2; muistin allokointi (varaus) osoite arvo 0x00 1.23 0x01 1 0x02-3 0x03 'k' 0x04 2 0x05 1938
Muistialue ja muuttujat Keskusmuisti (ram) osoite arvo 1. int a = 1; 2. int b = 2; 3. b = 8; arvon muutos 0x00 1.23 0x01 1 0x02-3 0x03 'k' 0x04 8 0x05 1938
Muistiosoitteeseen viittaaminen Keskusmuisti (ram) 1. int a = 1; 2. cout << &a; osoite arvo 0x00 1.23 0x01 1 0x02-3 0x03 'k' > g++ -o app printaddress.cpp >./app > 0x01 0x04 8 0x05 1938
Muistialue ja muuttujat 1. int a = 1; 2. int* b = &a; muistin allokointi (varaus) Keskusmuisti (ram) osoite arvo 0x00 1.23 0x01 1 0x02-3 muuttuja, joka sisältää kokonaisluvun muistipaikan osoitteen a-muuttujan muistipaikan osoite 0x03 'k' 0x04 0x01 0x05 1938
Muistiosoitteeseen viittaaminen 1. int a = 1; 2. int* b = &a; 3. cout << b; Keskusmuisti (ram) osoite arvo 0x00 1.23 0x01 1 0x02-3 0x03 'k' > g++ -o app printaddress.cpp >./app > 0x01 0x04 0x01 0x05 1938
Muistiosoitteeseen viittaaminen 1. int a = 1; 2. int* b = &a; 3. cout << b; 4. cout << *b; > g++ -o app printaddress.cpp >./app > 0x01 > 1 Keskusmuisti (ram) osoite arvo 0x00 1.23 0x01 1 0x02-3 0x03 'k' 0x04 0x01 0x05 1938
Muistiosoitteeseen viittaaminen 1. int a = 1; 2. int* b = &a; 3. a = 12; 4. cout << *b; > g++ -o app printaddress.cpp >./app > 12 Keskusmuisti (ram) osoite arvo 0x00 1.23 0x01 12 1 0x02-3 0x03 'k' 0x04 0x01 0x05 1938
Muistiosoitteeseen viittaaminen Osoitin B arvo: 0x01 Osoitin D arvo: 0x01 A osoitteessa: 0x01 arvo: 12 Osoitin C arvo: 0x01 Osoitin E arvo: 0x01
Osoitin Osoitin (pointer) on muuttuja, joka sisältää keskusmuistiosoitteen! Osoittimia käytetään dynaamisessa muistinhallinnassa ja aliohjelmien parametreissa. Palataan näihin myöhemmin... Osoitinmuuttujan määrittely tyyppi* osoitin;
Osoittimen määrittely ja alustus Osoitinmuuttujan määrittely int* osoitin; Alustus osoitin = NULL; osoitin = 0; osoitin = &muuttuja; Esimerkki: pointer1.cpp
Osoite- ja sisältöoperaattori Osoitinmuuttujan käyttö edellyttää kahden eri operaattorin käyttöä: & osoiteoperaattori * sisältöoperaattori & ja * - merkkien tarkoitus vaihtelee riippuen kontekstista!
Esimerkki int a = 5; // Määritellään osoitintyyppinen muuttuja int* b = &a; // Tulostaa muistipaikan osoitteen cout << b << endl; // Tulostaa arvon 5 // HUOM! Nyt siis * merkki tarkoittaa // sisältöoperaattoria! cout << *b << endl; // Esimerkki: pointer2.cpp
Vakio-osoitin 1 int luku1 = 1; int luku2 = 2; int* const osoitin = &luku1; // Tämä onnistuu *osoitin = 10; // Tämä ei osoitin = &luku2;
Vakio-osoitin 2 int luku1 = 1; int luku2 = 2; const int* osoitin = &luku1; // Tämä ei onnistu *osoitin = 10; // Tämä onnistuu osoitin = &luku2;
Vakio-osoitin 3 int luku1 = 1; int luku2 = 2; const int* const osoitin = &luku1; // Tämä ei onnistu *osoitin = 10; // Tämä ei onnistu osoitin = &luku2;
Osoitin tietueeseen Kun tietueen kenttiin halutaan viitata osoittimen kautta, käytetään merkintää * tai -> DATE pvm = {1,1,2000}; DATE* osoitin = &pvm; cout << osoitin << endl; // cout << osoitin.vuosi << endl; cout << (*osoitin).vuosi << endl; cout << osoitin->vuosi << endl; Esimerkki: pointer-struct.cpp