*x++=*y++
815338A
Ohjelmointikielten
periaatteet
2014 - 2015
IV.1 Imperatiivinen ohjelmointi
– muuttujat ja tietotyypit
*x++=*y++
Sisältö
1.
2.
3.
4.
5.
6.
7.
8.
Yleistä muuttujista
Sidonta
Tyypin tarkistus
Näkyvyysalue
Yleistä tietotyypeistä
Primitiiviset tietotyypit
Rakenteelliset tietotyypit
Osoitintyyppi
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
2
*x++=*y++
IV.1.1 Yleistä muuttujista
Imperatiivisen ohjelmoinnin keskeisimpiä käsitteitä
Muuttuja mallintaa tietokoneen muistipaikkaa
Muuttujaan liittyy
1. Nimi (name)
Tapa yksilöidä muuttuja
2. Osoite (address)
Muistiosoite, jossa muuttujan arvo sijaitsee
3. Arvo (value)
Data joka kulloinkin on muuttujan osoitteen osoittamassa
muistipaikassa
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
3
*x++=*y++
IV.1.1 Yleistä muuttujista (2)
Muuttujan ominaisuuksia
1. Tyyppi (type)
Muuttujan tietorakenteen nimi
2. Näkyvyysalue (scope)
Se ohjelman osa, jossa muuttuja on käytettävissä
3. Elinaika (lifetime, extent)
Muuttujan muistinvaraamisen ja muistinvapauttamisen
välinen aika
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
4
*x++=*y++
IV.1.1.1 Muuttujan nimi
Merkkijono, jota käytetään tunnistamaan muuttuja
FORTRAN77: max. kuuden merkin mittaiset nimet
FORTRAN 90 käyttää 31 merkin rajoitusta
C-kieli: Nimen erottelupituutena vähintään 31
ensimmäistä merkkiä
Nykyään useimmissa kielissä (C++, Java) mielivaltaisen
pitkät nimet
Useimmiten nimen alettava kirjaimella (tai alaviivalla)
Isojen/pienien kirjainten erottelu
Pascal, FORTRAN ei eroa
Useimmiten erotetaan (C, Java jne)
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
5
*x++=*y++
IV.1.1.1.1 Erikoissanat
Erottavat kielen kontrollirakenteita kuvaavat sanat
muuttujista
Varatut sanat (reserved words)
Ei voi käyttää muuten kuin sille varattuun
tarkoitukseen
Avainsanat (keywords)
Avainsana on erikoismerkityksessä ainoastaan
tietyissä yhteyksissä
Nykykielissä yleensä ainoastaan varattuja sanoja
FORTRAN käyttää avainsanoja
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
6
*x++=*y++
IV.1.1.2. Muuttujan osoite
Muuttujaan liittyvän fyysisen muistiosoitteen arvo
Yleensä ilmaistaan heksalukuna
Ei yleensä staattinen, muuttujan osoite saattaa vaihdella
ohjelman suorituksen aikana
Usein käytetään nimitystä l-value (left value)
Osoite tiedettävä, kun muuttuja sijaitsee
sijoituslauseen vasemmalla puolella
Moninimisyys, aliasing
Kaksi erinimistä muuttujaa viittaa samaan
muistipaikkaan
Yleensä muodostaminen ei suotavaa
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
7
*x++=*y++
IV.1.1.3. Muuttujan tyyppi
Määrittelee
1. Muuttujan arvoalueen
2. Minkälaisia operaatioita tyypin muuttujalle voidaan
tehdä
Esimerkki: Java-kielessä
Suurin kokonaisluku:
Integer.MAX_VALUE
2147483647
pienin:
Integer.MIN_VALUE
-2147483648
Muuttujiin voidaan soveltaa perusaritmetiikan
operaatioita.
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
8
*x++=*y++
IV.1.1.4. Muuttujan arvo
Muuttujan muistiosoitteen kulloinenkin sisältö
Tässä muistiosoite = sellainen muistialue, johon koko
muuttujan data mahtuu
Esimerkki: Javan double-tyyppinen muuttuja
kahdeksan tavun kokoinen -> muuttujan osoite
kahdeksan tavun kokoinen muistialue, jossa
säilytetään muuttujan arvoa.
Usein nimitetään r-valueksi (right value)
Tarvitaan sijoituslauseen oikealla puolella.
Huom! Jotta päästäisiin käsiksi r-valueen, on l-value
aina määritettävä ensin
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
9
*x++=*y++
IV.1.2. Sidonta
Yksi keskeisimmistä muuttujiin liittyvistä käsitteistä
Jonkin ominaisuuden liittämistä ohjelman itsenäiseen
kokonaisuuteen
Muuttujan tapauksessa tyypinsidonta tai
muistinsidonta
Tyypinsidonta liittää muuttujaan jonkin tietotyypin
Muistinsidonta liittää muuttujaan muistiosoitteen (varaa
riittävästi muistia, jotta muuttujan arvo voidaan
tallentaa)
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
10
*x++=*y++
IV.1.2. Sidonta (2)
Sidonta-aika (binding time) = milloin tietty sidonta
tehdään
Varhainen sidonta lisää tehokkuutta
Myöhäinen sidonta lisää joustavuutta
Staattinen sidonta (static binding) ennen ohjelman
ajoa – ei muutu ajon aikana
Dynaaminen sidonta (dynamic binding) =
ajonaikainen sidonta
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
11
*x++=*y++
IV.1.2.1. Tyypinsidonta
Muuttujaan on liitettävä tietotyyppi ennen kuin sitä voi
ohjelmassa käyttää
Voidaan tehdä:
1. Staattisesti
i. eksplisiittisellä tai
ii. implisiittisellä esittelyllä
2. Dynaamisesti
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
12
*x++=*y++
IV.1.2.1.1 Tyypin staattinen sidonta
Eksplisiittinen esittely: ohjelmalauseessa määritellään
muuttuja tietyn tyyppisiksi, esimerkiksi C:ssä
float f1;
Useimmissa staattista tyypinsidontaa käyttävissä
kielissä pakollinen
Implisiittinen esittely liittää muuttujaan tietotyypin jonkin
sopimuksen mukaan ilman erillistä esittelyä
Esim. FORTRANissa muuttuja INTEGER-tyyppinen jos
nimi alkaa I, J, K, L, M tai N-kirjaimella; muuten REAL
-tyyppinen
Haitta: Esittelyn poisjäänti vahingossa voi johtaa
hankalasti löydettäviin virhetoimintoihin
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
13
*x++=*y++
IV.1.2.1.2 Tyypin dynaaminen sidonta
Tyyppi määrittyy ohjelman suorituksen aikana
sijoituslausetta suoritettaessa
Dynaamista tyypinsidontaa käyttävät kielet eroavat
voimakkaasti staattiseen tyypinsidontaan perustuvista
Joustavia ja geneerinen ohjelmointi yksinkertaista
Esim. 1960-luvun APL ja SNOBOL
Esimerkki. JavaScript:
xz = [1.5, 2.2, 3.7] // Nyt xz taulukko
xz = 234 // Nyt xz kokonaisluku
Haittoja tehokkuuden menetys ja koodin luotettavuuden
heikkeneminen
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
14
*x++=*y++
IV.1.2.2. Muistin sidonta
Muuttujan tietotyyppi on määrätty -> voidaan varata
muistista alue (osoite) muuttujan arvon tallentamiseen
Muistin varaaminen = allokointi (allocation)
Allokoinnin käänteisprosessi on varatun muistin
vapauttaminen = deallokointi (deallocation)
Ohjelman muistialue:
Staattinen
eli globaali
alue
Pinomuisti
Varaamatonta
muistia
Kekomuisti
Yleensä pinomuisti ja kekomuisti kasvavat toisiaan
kohti
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
15
*x++=*y++
IV.1.2.2.1. Muuttujan elinikä
1.
2.
3.
4.
Muuttujan käyttämän muistin varaamisen ja
vapauttamisen välinen aika
Muuttujat eliniän perusteella:
Staattiset,
Pinodynaamiset,
Kekodynaamiset (explicit heap dynamic) ja
Implisiittisesti kekodynaamiset (implicit heap
dynamic)
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
16
*x++=*y++
IV.1.2.2.1.1 Staattiset muuttujat
Sidotaan muistiosoitteeseen ennen ohjelman suoritusta,
säilyvät sidottuna samaan osoitteeseen ohjelman
päättymiseen saakka
Käyttö tuo tehokkuutta
Aiheuttaa joustamattomuutta
Rekursiivisten aliohjelmien toteuttaminen mahdotonta
FORTRANin varhaisemmissa versioissa kaikki muuttujat
staattisia
C:ssä static-määreellä muuttuja staattiseksi
Pascal-kielessä ei staattisia muuttujia
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
17
*x++=*y++
IV.1.2.2.1.2. Pinodynaamiset muuttujat
Tyyppi staattisesti sidottu, mutta muistiosoite sidotaan
ajonaikaisesti esittelylausetta suoritettaessa
Perua Algol 60-kielestä: paikallisten muuttujien muisti
varattu pinomuistista dynaamisesti
Näin toimivat yleisimmät imperatiiviset nykykielet
Mahdollistavat rekursion
Aliohjelman muuttujalle varataan jokaisella kutsulla
kohti uusi muistiosoite
Säästää muistia - yhteinen muistialue kaikkien
aliohjelmien paikallisille muuttujille
Dynaaminen muistinvaraus hidastaa vähän suoritusta
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
18
*x++=*y++
IV.1.2.2.1.3. (Eksplisiittisesti) Kekodynaamiset
muuttujat
Yleisimmin kekomuistista varattavat muuttujat
Varataan kekomuistista ohjelmoijan käskystä
ajonaikaisesti
Voidaan viitata ainoastaan osoitinmuuttujan tai
viitetyypin muuttujan avulla
Voidaan varata
1. Operaattorilla (Java ja C++: new) tai
2. Kirjastofunktiolla (C: malloc())
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
19
*x++=*y++
IV.1.2.2.1.3. (Eksplisiittisesti) Kekodynaamiset
muuttujat (2)
Muistin vapauttaminen
Jotkin kielet: Automaattinen roskien keruu
(garbage collection) (esim. Java)
Joissakin kielissä ohjelmoijan vastuulla:
C++: operaattori delete
C: funktio free()
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
20
*x++=*y++
IV.1.2.2.1.3. (Eksplisiittisesti) Kekodynaamiset
muuttujat (3)
Esimerkki. Kekodynaamisen muuttujan varaaminen (ja
vapauttaminen) C ja C++ -kielissä.
C:
C++:
int *pnewint;
int *pnewint;
pnewint = malloc(sizeof(int)); pnewint = new int;
*pnewint = 10;
*pnewint = 10;
free(pnewint);
delete pnewint;
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
21
*x++=*y++
IV.2.2.1.4. Implisiittisesti kekodynaamiset
muuttujat
Sidotaan kekomuistiin vasta sijoituslauseen yhteydessä
Käyttö sallii hyvin joustavan ohjelmoinnin ja erittäin
geneerisen koodin kirjoittamisen
Monissa skriptikielissä (Perl, JavaScript)
merkkijonomuuttujat ja taulukot
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
22
*x++=*y++
IV.1.3. Tyypin tarkistus (type checking)
Varmistetaan että ohjelman operaatioissa käytettävien
muuttujien tyypit ovat yhteensopivat
Dynaaminen tarkistus: tyypit tarkistetaan ajonaikaisesti
Staattinen tarkistus: viimeistään käännösaikana
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
23
*x++=*y++
IV.1.3.1. Tyyppiyhteensopivuus (type compatibility)
1.
2.
Nimityypin yhteensopivuus (name type
compatibility)
Muuttujat yhteensopivaa tyyppiä ainoastaan, jos ne
on määritelty samannimisen tyyppisiksi
Rakennetyypin yhteensopivuus (structure type
compatibility)
Toteutuu, jos muuttujien rakenne on identtinen
Yleensä tyypintarkistukseen käytetään jotain välimuotoa
Nimityypin tarkistus liian rajoittava
Rakennetyypin tarkistus liian hankala toteuttaa
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
24
*x++=*y++
IV.1.3.1. Tyyppiyhteensopivuus (2)
Esimerkki. Pascal-kielisessä määrittelyssä
TYPE MYINT = INTEGER;
var a: INTEGER;
var ma:MYINT;
muuttujat a ja ma eivät nimityyppiyhteensopivat, mutta
ovat rakennetyyppiyhteensopivat
Pascal-kielessä ei käytetä nimityypin yhteensopivuutta,
sijoitus ma := a; on laillinen
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
25
*x++=*y++
IV.1.3.1. Tyyppiyhteensopivuus (2)
Esimerkki. C:
typedef struct
{
int x;
int y;
} myStruct;
typedef struct
{
int xx;
int yy;
} myOtherStruct;
myStruct str1;
myOtherStruct str2;
str1 = str2 ei sallittu: C-kielessä muuten
rakenneyhteensopivuus paitsi tietueiden (struct) ja
unionien (union) suhteen
C++ ja Java käyttävät nimityyppiyhteensopivuutta
C++: typedefillä samat tyypit
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
26
*x++=*y++
IV.1.3.2. Vahvasti tyypitetty (strongly typed) kieli
1. Jokaisella muuttujalla oltava hyvin määritelty tyyppi
2. Tyyppivirheet havaitaan aina
Pidetään tavoittelemisen arvoisena piirteenä
Estää ohjelmointivirheet, jotka johtuvat
1. Vääräntyyppisen muuttujan sijoittamisesta tai
2. Käyttämisestä parametrina aliohjelmakutsussa
Varsin harvat kielet täyttävät, jos sovelletaan tiukasti
Muunnossäännöt (coercion)
Vaikuttavat tyypintarkistukseen
Vahvasti tyypitetyssäkin kielessä esim. aritmeettisille
operaatioille sääntöjä, jotka rikkovat periaatteessa
tyypitystä vastaan
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
27
*x++=*y++
IV.1.3.2. Vahvasti tyypitetty (strongly typed) kieli
(2)
Pascal vaihtelevia tietueita lukuun ottamatta
C:ssä monia tapauksia, joissa tyyppivirhe voi jäädä
havaitsematta -> C ei niin vahvasti tyypitetty kuin Pascal
C++: tyypintarkistus vahvempi kuin C:ssä, ei vahvasti
tyypitetty
Ada, Java ja C# (lähes) vahvasti tyypitettyjä
Tyyppivirhe voi syntyä ohjelmoijan itse pakottamana
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
28
*x++=*y++
IV.1.4. Näkyvyysalue (scope)
Niiden ohjelman lauseiden kokonaisuus, joiden alueella
muuttuja on näkyvä (visible), t.s. käytettävissä.
Globaali (global) muuttuja: koko ohjelma
Paikalliset eli lokaalit (local) muuttujat
(ohjelmalohkon tai muun vastaavan yksikön) määritelty
kyseisessä yksikössä
Ei-paikalliset (nonlocal) muuttujat: Lohkon sisällä
näkyvät lohkon ulkopuolella määritellyt muuttujat
Voi määräytyä
Staattisesti ennen ohjelman suoritusta tai
Dynaamisesti ohjelman suorituksen aikana
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
29
*x++=*y++
IV.1.4.1. Staattinen näkyvyysalueen
määräytyminen
Yleisin menetelmä imperatiivisissa kielissä
Muuttujien näkyvyysalueet määräytyvät ennen ohjelman
suoritusta ohjelman rakenteen perusteella
Rakenteet voivat olla toisilleen alisteisia ->
näkyvyysalueiden sisäkkäisyys
Aliohjelmalla useimmiten oma näkyvyysalue
Nykykielissä voidaan muodostaa uusia näkyvyysalueita
määrittelemällä ohjelmalohkoja (blocks)
C: aaltosulkujen välinen osa on lohko
Kootun lauseen (compound statement) sisällä ei
voida esitellä uusia muuttujia (kuten lohkossa)
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
30
*x++=*y++
IV.1.4.1. Staattinen näkyvyysalueen
määräytyminen
Jos sisemmissä näkyvyysalueissa esitellään samannimisiä
muuttujia kuin alueen sisältävässä lohkossa, on
ulomman alueen muuttuja piilotettava sisemmässä
lohkossa
Pascalissa BEGIN … END –pari määrittelee kootun
lauseen -> Pascalissa ei lohkoja, aliohjelmilla oma
näkyvyysalue ja aliohjelmat voivat olla sisäkkäisiä
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
31
*x++=*y++
IV.4.2. Dynaaminen näkyvyysalueen
määräytyminen
Hyvin harvat ohjelmointikielet käyttävät
Esim. APL, SNOBOL, Perlissä mahdollinen
Perustuu aliohjelmien suoritusjärjestykseen -> aktiivisen
aliohjelman muuttujat näkyvät kaikille aliohjelmille, joita
kutsutaan kyseisen aliohjelman käynnistämisen jälkeen
Ongelmia:
Koodin luettavuus huononee
Ohjelman luotettavuus heikkenee
Etu: Aliohjelmien tiedonvälityksen helpottuminen
Haitat suuremmat -> ei juuri käytetä
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
32
*x++=*y++
IV.1.5. Yleistä tietotyypeistä
Tietotyyppi (data type): Joukko arvoja, joihin liittyy
joukko näihin arvoihin sovellettavia operaatioita
Keskeinen käsite ohjelmoinnissa, koska luokittelee
ohjelman datan
Primitiivinen tietotyyppi (primitive data type):
määrittelemiseen ei käytetä muita tietotyyppejä
Lähes jokaisessa kielessä määritellään joukko
primitiivisiä tietotyyppejä valmiiksi
Louden: yksinkertainen (simple) tietotyyppi:
tietotyyppi, jolla ei ole muuta rakennetta kuin
sisäänrakennettu aritmeettinen tai peräkkäinen
rakenne
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
33
*x++=*y++
IV.1.6. Primitiiviset tietotyypit
Jaetaan tyypillisesti numeeriseen, loogiseen ja
merkkitietoon
Useissa varhaisissa ohjelmointikielissä ainoat
primitiiviset tietotyypit numeerisia
Alkuperäisessä BASIC-kielessä ainoastaan
liukulukutyyppi
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
34
*x++=*y++
IV.1.6.1. Numeeriset tyypit
Kokonaislukutyyppi yleisin numeerinen primitiivinen
tietotyyppi
Pituus voi vaihdella; 32 bittiä nykyään yleisin
Liukulukutyyppi (floating-point type)
Esittää reaalilukuja (likimääräisesti) tietokoneessa
Esitetään useimmiten IEEE:n standardilla 754
Diskreettien rakenteiden kurssissa esityksestä tarkemmin
Desimaalityyppi
Tietynmittaisille desimaaliluvuille tarkka esitys
Rajoittaa esitettävien lukujen kokoa
Käytössä C#-kielessä (decimal), pituus 128 bittiä
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
35
*x++=*y++
IV.6.2. Looginen tietotyyppi (boolean, logical type)
Periaatteessa tietotyypeistä yksinkertaisin - tarvitsee vain
arvot tosi ja epätosi
Esitystapa vaihtelee
C: mikä tahansa nollasta poikkeava lukuarvo tulkitaan
todeksi ja nolla epätodeksi.
Yleensä mahdollisuus saada arvot true ja false
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
36
*x++=*y++
IV.1.6.3. Merkkityypit
Merkkitieto esitetään tietokoneen sisäisesti numeerisina
koodeina.
Aiemmin yleisin koodauskäytäntö ASCII (American
Standard Code for Information Interchange)
Nykyään UNICODE (2 tavua/merkki) yleistyy,
esimerkiksi Java, C#: char kahden tavun kokoinen
Merkkijonotyyppi (character string type)
Useimmiten ei ole primitiivinen
FORTRANissa (77 jälkeen) ja BASICissä primitiivisiä
Monessa kielessä valmiiksi määriteltyjen
perustietotyyppien joukossa
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
37
*x++=*y++
IV.1.6.3. Merkkityypit (2)
Merkkijonomuuttujien tyypit:
Staattisen pituuden merkkijonot: aina täynnä
merkkejä. Jos lyhempi merkkijono sijoitetaan
pitempään, loppu täytetään tyhjillä merkeillä
Pituudeltaan dynaamiset, mutta rajoitetut: merkkejä
voi olla mielivaltainen määrä, mutta sitä rajoittaa
varattu tila
Pituudeltaan dynaamiset: vaihtelevan pituisia ilman
ylärajaa
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
38
*x++=*y++
IV.1.6.3. Merkkityypit (3)
C-kielen merkkijono
Merkkiin ’\0’ päättyvä yksiulotteinen merkkitaulukko
Voidaan käyttää myös C++:ssa, suositeltavampaa
käyttää standardikirjaston string-luokkaa
Pituudeltaan dynaaminen, mutta rajoitettu
Merkkijono-operaatiot kirjastofunktioilla
Pascal –kielen merkkijonot
Merkkien muodostamia taulukoita
Staattisia pituudeltaan
Vain samanpituisten merkkijonojen järjestystä
voidaan vertailla relaatio-operaattoreilla
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
39
*x++=*y++
IV.1.6.3. Merkkityypit (4)
FORTRANin merkkijonot
Primitiivinen tyyppi, esittely (FORTRAN77)
CHARACTER*10 JONO
Staattisia pituudeltaan
Javan merkkijonot
Object-luokasta periytyvän String-luokan ilmentymiä,
joten jossakin mielessä primitiivinen tyyppi
Oikeastaan ei kieleen sisäänrakennettu tyyppi, vaan
määritellään java.lang-paketissa
Dynaamisia pituudeltaan
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
40
*x++=*y++
IV.1.6.4. Ordinaalityyppi (ordinal type)
Arvot voidaan yhdistää positiivisiin kokonaislukuihin
luonnollisella tavalla
Useissa kielissä käyttäjän määrittelemiä
ordinaalityyppejä; eivät täytä primitiivisen tyypin
määritelmää, ovat kuitenkin yksinkertaisia tietotyyppejä
Luetellut tyypit (enumeration types)
Rajoitetut tyypit (subrange type)
Luetellun tyypin muuttujien arvot määritellään
luettelemalla symbolisiksi vakioiksi
Tyyppiin liittyy järjestys -> arvoja voidaan vertailla
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
41
*x++=*y++
IV.1.6.4. Ordinaalityyppi (2)
Esimerkki. Viikonpäivät lueteltuna tyyppinä Pascalilla:
TYPE paiva = (su,ma,ti,ke,tor,pe,la);
Sama C-kielellä:
enum paiva {su, ma, ti, ke, tor, pe, la};
Vertailu Pascalissa:
var ps,pt:paiva;
begin
ps:=su;
pt:=tor;
if pt > ps then
begin
(* lauseet *)
end;
end.
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
Vertailu C –kielessä:
enum paiva x = su,y = tor;
if(x < y)
{
// Lauseet
}
815338A Ohjelmointikielten periaatteet, Muuttujat
42
*x++=*y++
IV.1.6.4. Ordinaalityyppi (3)
Luetellun tyypin etuja
Määritellyt tyypit ovat helposti tulkittavissa
Rajojen ylityksen virhemahdollisuudet poistuvat mikäli
tarkistetaan lueteltujen tyyppien yhteensopivuus
Ellei lueteltua tyyppiä, on käytettävä numeerisia
muuttujia kuvaamaan lueteltuja tyyppejä -> Tähän
verrattuna:
1. Koodin luettavuus paranee
2. Luotettavuus paranee: Kahden eri tyypin muuttujat
eivät voi erehdyksessä sotkeutua toisiinsa,
muuttujilla ei voida tehdä aritmeettisia operaatioita
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
43
*x++=*y++
IV.1.6.4. Ordinaalityyppi (4)
Javassa versiosta 1.5 lähtien enum-tyyppi
Esim.
enum Paiva {
SUNNUNTAI, MAANANTAI, TIISTAI, KESKIVIIKKO,
TORSTAI, PERJANTAI, LAUANTAI
}
Vakiot olioita -> monipuolisempi kuin aiemmin mainitut
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
44
*x++=*y++
IV.1.6.4.1 Rajoitettu tyyppi
Jonkin ordinaalityypin peräkkäisten arvojen osajono
Ensimmäiseksi Pascalissa
Voidaan käyttää myös Adassa
Pascalissa:
TYPE
allesata = 1..100;
pienetkirjaimet = ’a’..’z’;
Käyttäminen lisää luotettavuutta mikäli kääntäjä
tarkistaa virheelliset operaatiot
Ei käytetä muissa yleisissä kielissä Pascalin ja Adan
lisäksi
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
45
*x++=*y++
IV.1.7. Rakenteelliset tietotyypit
1.
2.
3.
4.
Koostuvat yhdestä tai useammasta yksinkertaista tai
rakenteista tyyppiä olevasta komponentista
Taulukot
Tietueet
Unionit
Pascal-kielen joukkotyyppi
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
46
*x++=*y++
IV.1.7.1. Taulukot
Yleisimmin käytettyjä tietorakenteita
Kiinteä määrä samaa tyyppiä olevia tietoalkioita, jotka
sijaitsevat peräkkäin yhtenäisessä muistialueessa ->
Käyttö tehokasta, koska minkä tahansa alkion
muistiosoite voidaan suoraan laskea
Alkiot mitä tahansa tietotyyppiä, joko primitiivistä,
kielessä määriteltyä tai ohjelmassa määriteltyä
Alkioihin viitataan taulukon nimellä ja alkion indeksillä
taulukossa
C –pohjaisissa kielissä indeksit alkavat nollasta
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
47
*x++=*y++
IV.1.7.1. Taulukot (2)
Esimerkki: Kokonaislukutaulukko eri kielissä
C:
int lukutaulu[50];
lukutaulu[10] = 34;
Pascal:
VAR lukutaulu: ARRAY [0..49] OF INTEGER;
begin
lukutaulu[10] := 34;
FORTRAN:
INTEGER LTAULU(0:49)
LTAULU(10) = 34;
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
48
*x++=*y++
IV.1.7.1.1 Taulukkojen tyypit
Neljä tyyppiä indeksien rajojen sidonnan ja muistin
allokoinnin tapahtuma-ajan perusteella
1. Staattiset taulukot (static arrays)
Rajat sidotaan staattisesti, taulukon muisti varataan
staattisesti
Suoritusajan tehokkuus
2. Kiinteät pinodynaamiset taulukot (fixed stackdynamic arrays)
Rajat sidotaan staattisesti, muisti varataan
ajonaikaisesti pinomuistista
Muistin käyttö tehokkaampaa kuin staattisilla
taulukoilla
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
49
*x++=*y++
IV.1.7.1.1 Taulukkojen tyypit (2)
3. Pinodynaamiset taulukot (stack-dynamic arrays)
Rajat sidotaan dynaamisesti, muisti varataan
pinomuistista. Molemmat pysyvät vakioina taulukon
elinajan
Taulukon kokoa ei tarvitse tietää etukäteen -> lisää
joustavuutta
4. Kekodynaamiset taulukot (heap-dynamic array)
Rajat sidotaan dynaamisesti, taulukon muisti
varataan dynaamisesti kekomuistista
Taulukon rajat ja varattu muisti voivat muuttua sen
elinaikana -> joustavin tyyppi
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
50
*x++=*y++
IV.1.7.1.2. Taulukkotyypit eri kielissä
Staattiset taulukot
FORTRANin taulukot (versio 77 ja ennen)
REAL REAALILUVUT(4)
C/C++-kielessä taulukko voidaan esitellä staticmääreellä staattiseksi
Kiinteät pinodynaamiset taulukot
Yleisimmin pinosta varattavat taulukot, esim. C, C++
(aiemmat versiot), Pascal
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
51
*x++=*y++
IV.1.7.1.2. Taulukkotyypit eri kielissä (2)
Pinodynaamiset taulukot
Aiemmin harvinaisia imperatiivisissa kielissä
Adassa alusta saakka
AR_LEN := 25;
declare
AR: array(1..AR_LEN) of INTEGER;
C/C++-kielissä uusimmissa versioissa sallittu
int i,koko = 15;
for(i=5; i < 10; i++){
int taulu[koko]; // Nykyään käy C/C++:ssa
}
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
52
*x++=*y++
IV.1.7.1.2. Taulukkotyypit eri kielissä (3)
Kekodynaamiset taulukot
Javan, C#:n kaikki taulukot
int[] lukutaulu = new int[50];
C/C++ -kielissä varataan kuten muutkin dynaamiset
muuttujat
C:ssä malloc
C++:ssa new
int *lukutaulu;
lukutaulu =
malloc(50*sizeof(int));
lukutaulu[10] = 34;
free(lukutaulu);
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
int[] lukutaulu;
lukutaulu = new int[50];
lukutaulu[10] = 34;
delete[] lukutaulu;
815338A Ohjelmointikielten periaatteet, Muuttujat
53
*x++=*y++
IV.1.7.1.3. Moniulotteiset taulukot
Tarvitaan useampia indeksejä viittaamaan taulukon
alkioihin
Yleensä tarkoittaa sitä että taulukon ensimmäisen
indeksin alkiot (n-1) ulotteisia taulukoita jne.
Esimerkki: Pascalissa
ARRAY[1..6,3..21,0..3] OF INTEGER
on sama kuin
ARRAY[1..6] OF
ARRAY[3..21] OF
ARRAY[0..3] OF INTEGER
Yleensä dimensioille ei ylärajaa
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
54
*x++=*y++
IV.1.7.1.4. Taulukon alustaminen
Pascalissa ei mahdollista alustaa taulukkoa sen esittelyn
yhteydessä
FORTRANissa voidaan alustaa DATA –lauseella:
REAL REAALILUVUT(4)
DATA REAALILUVUT/1.1,2.5,99.3,12.2234/
C, C++, C#, Java: Mahdollista esitellä ja alustaa
taulukko luettelemalla sen alkiot ilman dimensioiden
määrittelemistä, esimerkiksi
int vektori[] = {2,4,6,8};
luo nelipaikkaisen taulukon
Altistaa virheille
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
55
*x++=*y++
IV.1.7.1.4. Taulukon alustaminen
Useampiulotteinen taulukko
C/C++ -kielessä ainoastaan niin, että vain yksi
dimensio jätetään vapaaksi:
int matriisi[][4] =
{{1,2,3,4},{2,3,4,5}};
Javassa sallittu
int matrix[][] = {{1,2,3,4},{2,3,4,5}};
C# -kielessä onnistuu, kirjoitettava
int[,] matriisi = {{1,2,3,4},{2,3,4,5}};
Javassa luotu taulukko aina alustettu oletusarvoilla,
C/C++: voi sisältää satunnaista dataa
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
56
*x++=*y++
IV.1.7.1.5. Taulukko-operaatiot
Yleensä kielissä ei juuri operaatioita, jotka käsittelevät
taulukkoa itsenäisenä yksikkönä
Tavallisesti toteutettu kirjastofunktioina tai sisällytetty
luokkakirjastoihin
FORTRAN 90:
Sisältää taulukko-operaatioita, esimerkiksi taulukkojen
summan (alkioittain)
Ada:
Mahdollista viitata taulukon osiin indeksirajoilla ->
voidaan käsitellä matriisin rivejä tai sarakkeita
vektoreina
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
57
*x++=*y++
IV.1.7.1.5. Taulukko-operaatiot (2)
APL
Laaja kokoelma kieleen rakennettuja vektori- ja
matriisioperaatioita
Suunniteltu tällaisten tehtävien ohjelmoimiseen
Sisältää operaattorit mm. matriisin transponointiin,
käänteismatriisin etsimiseen, vektoreiden piste- ja
ristituloille
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
58
*x++=*y++
IV.1.7.2.Tietueet (records)
Erityyppisten tietoalkioiden kooste, jossa tiettyyn alkioon
eli kenttään (field) viitataan sen nimellä
Muodostetaan loogisia kokonaisuuksia, jotka
koostuvat erilaisista tietoalkioista
Aiemmin sisältynyt kaikkiin yleisiin kieliin
Paitsi FORTRANiin
Oliokielissä ei tarvetta (C++:ssa mukana)
Muisti varataan peräkkäisistä muistipaikoista
Yleisarvio:
Käyttökelpoisia tietotyyppejä
Toteutus varsin suoraviivainen eikä sisällä ongelmia
yleensä missään ohjelmointikielessä
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
59
*x++=*y++
IV.1.7.2.Tietueet (2)
Esimerkki. C-kielessä määrittely
struct Asiakas
{
char nimi[25];
int tilinro;
};
esittely ja käyttö
(varataan pinosta):
varataan dynaamisesti :
struct Asiakas a;
strcpy(a.nimi,"Huijari");
a.tilinro = 21;
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
struct Asiakas* pa;
pa = malloc(
sizeof(struct Asiakas));
strcpy(pa->nimi,"Huijari");
pa->tilinro = 21;
815338A Ohjelmointikielten periaatteet, Muuttujat
60
*x++=*y++
IV.1.7.2.Tietueet (3)
Pascal-esimerkki
TYPE asiakas = RECORD
nimi: PACKED ARRAY[0..24] OF CHAR;
tilinro: INTEGER;
END;
VAR a:asiakas;
BEGIN
a.nimi := 'Huijari';
a.tilinro := 21;
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
61
*x++=*y++
IV.1.7.3. Unioni
Vastaa tietotyyppien unionia
Muuttujassa vain yksi kenttä, joka voi olla tyypiltään
jokin annetuista tietotyypeistä -> muuttujan sisältämä
tiedon tyyppi voi vaihdella ohjelman suorituksen
aikana
Käyttö voi olla hyödyllistä esimerkiksi kirjoitettaessa
koodia, jonka on tarkoitus toimia eri ympäristöissä
Esim. kokonaisluku voi olla 16-, 32- tai 64-bittinen
Voidaan kirjoittaa koodia, jossa tehdään eistandardimaisia tyypinmuunnoksia -> Riski: voi
aiheuttaa monia ongelmatilanteita
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
62
*x++=*y++
IV.1.7.3. Unioni (2)
Tyypintarkistusta tyyppiin liitettävä tietokenttä, jonka
perusteella päätellään, mikä kulloinkin talletettu tyyppi
Valitsinkenttä (tag field, discriminant)
C ja C++ -kielissä ns. vapaa unioni (free union).
Ei valitsinkenttää kertomassa, minkä tyyppinen tieto
on tallennettu muuttujaan
Muuttujalle varataan tila suurimman mahdollisen
tietotyypin mukaan
Ei tyypintarkistusta -> ohjelmoija vapaa muuntamaan
tietotyypin miksi tahansa vaihtoehdoista
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
63
*x++=*y++
IV.1.7.3. Unioni (3)
Pascal-kielessä kutsutaan vaihtelevaksi tietueeksi
Tietueessa kiinteä ja vaihteleva osa. Kiinteä osa aina
samanlainen, vaihteleva osa voi sisältää eri tietotyypin
arvoja
Adassa samankaltainen vaihtuvan tietueen tyyppi kuin
Pascalissa
Parannettu: Valitsinkenttää ei voi muuttaa
muuttamatta koko tietuetta-> unionityypin
toteutuksen tulisi olla turvallinen
Ongelmallisuuden vuoksi jätetty toteuttamatta monissa
kielissä
Esim. Java, C#
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
64
*x++=*y++
IV.1.7.3. Unioni (4)
C-kielinen esimerkki
union IntMerkki
{
int myInt;
char myChar;
};
int arvo;
union IntMerkki imer;
imer.myChar = 'A';
arvo = imer.myInt;
// arvo satunnainen
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
imer.myInt = 5432;
jolloin
imer.myChar == ’8’;
Mahdollista kiertää C-kielen
tyypintarkistus -> turvallisuus jää
ohjelmoijan vastuulle
Neuvo: Käytä unioneja C/C++ ohjelmassa aina tarkasti harkiten
815338A Ohjelmointikielten periaatteet, Muuttujat
65
*x++=*y++
IV.1.7.4. Joukkotyyppi (set)
Tyypin muuttujat voivat sisältää järjestämättömän
kokoelman jonkin ordinaalityypin muuttujan erillisiä
arvoja -> mallinnetaan matemaattista joukkoa
Yleisistä (imperatiivisista) ohjelmointikielistä ainoastaan
Pascalissa
Kirjastoluokkana C++:ssa, C#:ssa ja Javassa
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
66
*x++=*y++
IV.1.7.4. Joukkotyyppi (2)
Esimerkki (Pascal)
TYPE
paiva = (su,ma,ti,ke,tor,pe,la);
paivaset = SET OF paiva;
VAR joukko:paivaset;
BEGIN
joukko := [ma,pe,ke];
IF pe IN joukko THEN
WRITELN('PAIVA OLI JOUKOSSA')
ELSE
WRITELN('PAIVA EI OLLUT JOUKOSSA');
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
67
*x++=*y++
IV.1.8. Osoitintyyppi (pointer type)
Muuttujien arvot muistiosoitteiden arvoja ja lisäksi
erityinen arvo null (tai nil)
Muuttujia kutsutaan yleensä osoittimiksi (pointers)
Tarvitaan käsittelemään dynaamisia muuttujia ja
erityisesti dynaamisia tietorakenteita
Lähes kaikissa imperatiivisissa ohjelmointikielissä
mahdollista käyttää osoittimia
Poikkeus FORTRAN: tietorakenteiden käsittely
hankalaa
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
68
*x++=*y++
IV.1.8. Osoitintyyppi (2)
Muuttuja sisältää muistiosoitteen -> muuttujana aina
samantyyppinen
Ohjelmoinnin kannalta tiedettävä osoitinmuuttujan
tarkoitetyyppi (reference type) = minkälaiseen
muuttujaan osoittaa
Muuttuja, johon osoitinmuuttujan arvo kulloinkin viittaa,
on sen tarkoitemuuttuja
Osoitinmuuttuja voi viitata mihin tahansa
tietotyyppiin, myös toiseen osoittimeen
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
69
*x++=*y++
IV.1.8. Osoitintyyppi (3)
Osoitin esitellään kirjoittamalla tarkoitetyyppi ja sen
jälkeen tyyppioperaattori ennen muuttujan nimeä
C/C++ -kielessä *
Pascalissa ^
Adassa access
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
70
*x++=*y++
IV.1.8.1. Osoittimien tärkeimmät operaatiot
1. Sijoitus (assignment)
Sijoittaa osoitinmuuttujan arvoksi jonkin muistipaikan
2. Muistipaikan sisältöön viittaaminen (viittauksen
purkaminen, dereferencing)
Toteutetaan yleensä jollakin sisältö-operaattorilla
3. Muuttujien vertailu, ts. sen vertaaminen osoittavatko ne
samaan muistipaikkaan
Pascalissa ainoat sallitut operaatiot osoittimille
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
71
*x++=*y++
IV.1.8.1. Osoittimien tärkeimmät operaatiot (2)
Esimerkki. C-kielisessä ohjelmassa voisi
kokonaislukumuuttuja luku olla muistipaikassa 9876 ja
sen arvo olla 1000. Olkoon toinen kokonaislukumuuttuja
toinenluku esitelty ohjelmassa. Tällöin koodi
int *ptr;
ptr = 9876;
toinenluku = *ptr;
kopioi muistipaikasta 9876 arvon 1000 muuttujan
toinenluku arvoksi, ts. tekee sijoituksen
toinenluku = luku;
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
72
*x++=*y++
IV.1.8.1. Osoittimien tärkeimmät operaatiot (3)
Esimerkki. Pascal:
VAR r:REAL;
VAR pr,prtoka:^REAL; (* Osoittimia *)
BEGIN
NEW(pr); (* Varataan muisti *)
NEW(prtoka); (* Varataan muisti *)
pr^ := 21.1; (* Sijoitetaan arvo *)
prtoka^ := 11.1; (* Sijoitetaan arvo *)
r := pr^; (* Nyt r saa arvon 21.1 *)
prtoka := pr;(*Osoittavat nyt samaan paikkaan*)
prtoka^ := 33.3;(* pr^ ja prtoka^ kumpikin 33.3
*)
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
73
*x++=*y++
IV.1.8.2. C/C++ -kielten osoittimet
Voi käyttää hyvin monipuolisesti -> ohjelmoijalle
monenlaisia mahdollisuuksia, mutta virheellinen käyttö
helppoa
Muuttujan muistiosoite voidaan selvittää ja sijoittaa
osoitinmuuttujaan, esimerkiksi
int muuttuja = 20;
int *pm;
pm = &muuttuja;
*pm = 55; // Nyt muuttuja == 55
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
74
*x++=*y++
IV.1.8.2. C/C++ -kielten osoittimet (2)
C-kielessä tyypintarkistus väljä:
float f = 0.46875;
int *pif;
float *pf;
pif = &f;
pf = pif;
C:ssä sallittu, mutta ei C++ :ssa
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
75
*x++=*y++
IV.1.8.2. C/C++ -kielten osoittimet (3)
Osoitinaritmetiikka sallittu
Jos ptr on osoitintyypin muuttuja, ptr+1 osoittaa
seuraavan tarkoitetietotyypin muuttujan osoitteeseen.
Esimerkiksi:
char* ptr; -> ptr+1 osoittaa seuraavaan tavuun
int* ptr; -> ptr+1 osoittaa neljän tavun päähän
C/C++ -kielissä geneerinen osoitintyyppi void* voi
osoittaa minkätyyppiseen muuttujaan tahansa
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
76
*x++=*y++
IV.1.8.2. C/C++ -kielten osoittimet (4)
Esimerkki. Taulukon läpikäynti osoittimilla C/C++:ssa
char c;
int ki;
double rl;
int index;
char merkit[4] =
{'a','b','c','d'};
int kokoluvut[4] =
{1,2,3,4};
double rluvut[4] =
{1.1,2.2,3.3,4.4};
char* pc = merkit;
int* pi = kokoluvut;
double* pd = rluvut;
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
for(index=0;index < 4;
index++)
{
c = *(pc + index);
ki = *(pi + index);
rl = *(pd + index);
printf("Merkki on %c,
kokonaisluku on %d, reaaliluku
on %e\n", c,ki,rl);
}
815338A Ohjelmointikielten periaatteet, Muuttujat
77
*x++=*y++
IV.1.8.3. Osoitintyypin ongelmia
1. Moninimisyys
Seuraa väistämättä osoittimien sallimisesta
Osoittimet voidaan asettaa osoittamaan samaan
muistipaikkaan
Katsotaan yleensä haitallisiksi
2. Roikkuvat osoittimet
Osoittavat jo vapautettuun muistiin
Käytettäessä arvo satunnainen
Voi johtaa hankalasti löydettäviin virheisiin
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
78
*x++=*y++
IV.1.8.3. Osoitintyypin ongelmia (2)
3. Muistivuoto (memory leakage)
Ohjelmassa varattua dynaamista muistia ei
vapauteta
Syntyy usein hävittämällä viite dynaamiseen muuttujaan
Voi johtaa kekomuistin loppumiseen ja ohjelman
kaatumiseen
Osoitintyypin virheet yleisimpien C/C++ -ohjelmien
virheiden joukossa
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
79
*x++=*y++
IV.1.8.4. Viitetyyppi (reference type)
Osoitintyypin muuttujien ongelmallisuuden takia ainakin
Javassa ja C#:ssa luovuttu niistä ja korvattu viitteillä
Aluksi C++ -kieleen lähinnä toteuttamaan viitetyypin
parametrinvälitys funktioille
Viitetyypin muuttujan avulla voidaan luoda muuttujalle
alias
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
80
*x++=*y++
IV.1.8.4. Viitetyyppi (2)
C++ -kielen viite: vakio-osoitin, jolle tehdään
implisiittinen muistiosoitteeseen viittaaminen
On vakio -> alustettava jollakin muistiosoitteen
arvolla, viittaa samaan muistiosoitteeseen koko
elinaikansa
Esimerkki
float f;
float &ref_f = f;
tekee muuttujista f ja ref_f aliaksia -> sijoituslause
ref_f = 2.78;
sijoittaa muuttujan f arvoksi 2.78.
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
81
*x++=*y++
IV.1.8.4. Viitetyyppi (3)
Java yleistänyt viitemuuttujan tyyppiä -> osoittimet voitu
korvata viitteillä
Kaikki luodut oliot Javassa varataan dynaamisesti
kekomuistista, olion nimi on viite olioon
Osoitinaritmetiikka ei sallittua
Eivät ole vakio-osoittimia, viite voidaan asettaa
osoittamaan toiseenkin olioon
Muistivuotojen estämiseksi Javassa roskien keruu
(garbage collection) huolehtii siitä, että oliot
vapautetaan, kun niihin ei enää ole viittauksia
Ari Vesanen, Tietojenkäsitttelytieteiden laitos
815338A Ohjelmointikielten periaatteet, Muuttujat
82
© Copyright 2025