Luentokalvot - Muuttujat ja tietotyypit

Transcription

Luentokalvot - Muuttujat ja tietotyypit
*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