...
Muuttuja voi olla käytettävissä ainoastaan ohjelmalohkossa, yhdessä funktiossa (paikallinen), yhdessä tiedostossa tai koko ohjelmassa. Riippuen siitä missä kohtaa ohjelmaa muuttuja esitellään, sitä voidaan käyttää ohjelmassa eri tavoin.
...
Yhteinen, globaali, public muuttuja esitellään kaikkien funktioiden ulkopuolella ja se "näkyy" eli se on käytettävissä kaikissa funktioissa, jotka ovat samassa tiedostossa kuin muuttuja. Yhteistä muuttujaa on hyvin helppo käyttää, koska sen arvoon päästään käsiksi kaikista funktioista. Kun ohjelma kasvaa suureksi, siinä voi olla tuhansia muuttujia, jolloin yhteisten muuttujien käyttö tulee hankalaksi ja ohjelmasta tulee altis virheille.
Code Block |
---|
#include <stdio.h>
int x=0; // Yhteinen (globaali) muuttuja
int y=0; // Yhteinen (globaali) muuttuja
int main()
{
}
|
Paikallinen eli local muuttuja
Paikallinen muuttuja esitellään ohjelmalohkon (tai funktion) sisällä ja se on käytettävissä ainoastaan siinä funktiossalohkossa, jossa se on määritelty. Alkuarvokseen paikallinen muuttuja saa satunnaisarvon, siksi paikalliset muuttujat monesti alustetaan tulee alustaa johonkin alkuarvoon esittelyn yhteydessä.
Paikallinen muuttuja katoaa (ja siten kadottaa arvonsa), kun funktio päättyy.
Paikallinen staattinen muuttuja
Jos halutaan paikallisen muuttujan muistavan arvonsa siitä, kun funktio suoritettiin edellisen kerran, täytyy muuttuja esitellä staattisena esim. seuraavastiEsimerkki ohjelmalohkon paikallisesta muuttujasta:
Code Block |
---|
static int Laskuri;
|
Staattinen muuttuja saa automaattisesti alkuarvokseen nollan, joten sitä ei alusteta esittelyn yhteydessä. Staatisena esitellyllä muuttujalla voidaan esim. laskea, kuinka monta kertaa ko. funktiossa on käyty.
Yhteinen staattinen muuttuja
Haluttaessa rajata yhteisen muuttujan näkyvyys ainoastaan siihen tiedostoon, jossa se on esitelty, täytyy yhteinen muuttuja esitellä staattisena esim. seuraavasti:
Code Block |
---|
static long Summa;
|
...
int main()
{
int i;
for (i=0; i<100; i++) {
float f; // For-toistorakenteen sisäinen paikallinen muuttuja
printf("Anna liukuluku: ");
scanf("%f", &f);
printf("Annoit luvun %.2f\n", f);
}
}
|
Esimerkki funktion paikallisesta muuttujasta:
Code Block |
---|
void funktio()
{
float f; // For-toistorakenteen sisäinen paikallinen muuttuja
printf("Anna liukuluku: ");
scanf("%f", &f);
printf("Annoit luvun %.2f\n", f);
}
int main()
{
int i;
for (i=0; i<100; i++) {
f();
}
}
|
Merkkijonot
Merkkijono on vektori eli yksiulotteinen taulukko. C-kielessä ei merkkijonoille ole valmista muuttujaa, vaan merkkijonot on esiteltävä vektoreina seuraavasti:
Code Block |
---|
char Sukunimi[100]; |
Merkkijono on tyyppiä char
ja merkkijonon perään laitetaan hakasulkuihin merkkien suurin sallittu määrä +1. Viimeinen merkkijonon merkki on varattu lopetusmerkille \0, jonka ascii arvo on nolla, siitä kääntäjä tietää, mihin merkkijono loppuu. Merkkijonon esittelyssä muistista varattu alue ei tyhjene vaan sinne jää aikaisempi sisältö.
...
Viimeisessä vaihtoehdossa merkkijonon suurimmaksi sallituksi pituudeksi tulee 8 eli kun merkkijono alustetaan esittelyn yhteydessä ilman hakasulkujen välissä olevaa lukua, kääntäjä laskee merkkijonon pituuden automaattisesti.
Tietue, struct
...
Staattiset muuttujat
Paikallinen staattinen muuttuja
Jos halutaan paikallisen muuttujan muistavan arvonsa siitä, kun funktio suoritettiin edellisen kerran, täytyy muuttuja esitellä staattisena esim. seuraavasti:Tietue (struct) on erilaisten tietojen joukko, joka on yhdistetty yhden nimen alle. Tietueita käytetään tietokantojen yhteydessä, kun samaan tietojoukkoon täytyy tallettaa erityyppistä tietoa. Seuraavassa on esimerkki tietuemäärittelystä työntekijälle.
Code Block |
---|
structvoid TyontekijaTiedotfunktio() { char Sukunimi[50]; static char Etunimi[50]; char Sotu[15]; int Palkka; }; |
TyontekijaTiedot tietuerakenne voidaan ottaa käyttöön seuraavasti:
Code Block |
---|
struct TyontekijaTiedot Tyontekija;
|
Nyt voidaan antaa työntekijälle nimi
Code Block |
---|
strcpy(Tyontekija.Sukunimi,"Jokunen");
|
ja palkka
Code Block |
---|
Tyontekija.Palkka=15000;
|
Edellä olevassa tavassa on se ongelma, miten esitellä 1000 työntekijää? Seuraavassa kappaleessa on osittainen vastaus tähän.
Tietuetaulukot
Tietuetaulukon avulla voidaan esitellä monta tietuetta sisältävä tietokokonaisuus seuraavasti:
Code Block |
---|
struct Varastohyllyt { char Nimike[50]; int Kolliluku; };int Laskuri; // Paikallinen staattinen muuttuja, säilyttää tietonsa funktiokutsujen välillä } int main() { int Paikka=0; struct Varastohyllyt Hylly[1000]; strcpy(Hylly[Paikka].Nimike,"Kossu"); Hylly[Paikka].Kolliluku=10; return 1; } |
Esitetty taulukkomäärittely soveltuu tapauksiin, joissa etukäteen tiedetään, kuinka monta jäsentä taulukkoon kuuluu. Osoittimien avulla voidaan käsitellä tietuetaulukoita joustavammin, palaamme niihin myöhemmin.
Union
union on vaihtoehtorakenne, jolla voidaan vaihtoehtoisesti tallettaa haluttuun tietueen kohtaan toisen tyyppistä tietoa, esim:
Code Block |
---|
union Luku // esitellään union:
{
int iArvo;
double dArvo;
};
void JokuFunktio()
{
struct Luku Eka,Toka;
int iLuku=5;
double dLuku=10.45;
Eka.iArvo=iLuku;
Toka.dArvo=dLuku;
}
|
Union tietueen osana
Sellaisissa tapaksissa, joissa samaan tietueen kenttään halutaan tallettaa erityyppistä tietoa,
unionia käytetään tietueen osana.
...
}
|
Staattinen muuttuja saa automaattisesti alkuarvokseen nollan, joten sitä ei alusteta esittelyn yhteydessä. Staatisena esitellyllä muuttujalla voidaan esim. laskea, kuinka monta kertaa ko. funktiossa on käyty.
Yhteinen staattinen muuttuja
Haluttaessa rajata yhteisen muuttujan näkyvyys ainoastaan siihen tiedostoon, jossa se on esitelty, täytyy yhteinen muuttuja esitellä staattisena esim. seuraavasti:
Code Block |
---|
static long Summa; // Globaali staattinen muuttuja
int main()
{
}
|
Edellä oleva määrittely kannatta tehdä esim. silloin kun samaa ohjelmistoprojektia tekee useita henkilöitä ja halutaan estää samanimisten eri tiedostoissa olevien muuttujien vaikutus toisiinsa. Nämäkin muuttujat täytyy tietysti esitellä funktioiden ulkopuolella.