Massiivid

Massiivid (array) ei kuulu enam põhitüüpide hulka. Massiiv sisaldab mingit hulka muutujaid, mis kõik omavad sama tüüpi. See tüüp võib olla üks põhitüüpidest (täisarv, murdarv, sümbol) või mingi muu tuletatud tüüp. Massiivi defineerimisel lisatakse elementide arv muutuja nime järele kandilistesse sulgudesse. Numbri asemel võib sisestada ka konstantse väärtusega valemi. Näiteks:

int	nNumbers[20]; /* kakskümmend täisarvu */
char	Name[10], FamiliyName[2 * 10]; /* kaks sümbolite jada isiku 
                   ees- ja perekonnanime salvestamiseks */
#define LINES  25;
#define COLS   80;
char Display[LINES][COLS];

Nüüd ei määra muutuja nimi enam üht konkreetset muutujat, vaid tervet hulka. Massiivi ühe konkreetse elemendi väärtuse lugemiseks või muutmiseks tuleb lisada massiivi nimele soovitud elemendi järjekorranumber kandilistes sulgudes. Meeles tuleb aga pidada, et massiivi esimese elemendi number on 0, mitte 1 ja viimase oma (elementide hulk - 1). Selle reegli rikkumisega võite tekitada raskesti avastatava vea, mida translaator ei avasta. Kui te salvestate midagi ülemises näites defineeritud muutuja nNumbers elementi numbriga 20, siis kirjutate sellega üle temale järgneva muutuja Name esimesed kaks baiti (1 integer sisaldab 2 baiti).

Korrektsed tehted oleksid:

nNumbers[3] = 356;
nNumbers[16] = nNumbers[2] + 56;
strcpy(Name, "Peeter"); /* täidab massiivi Name esimesed 
                                     kuus kohta nimetatud sümbolitega ja 
                                     sisestab seitsmendasse kohta, s.o. kohta 
                                     nr.6 lõpu tähisena 0*/
Name[0] = 0;	  /* sisestab esimesse positsiooni arvu null.
                     See on lihtsaim viis jada tühjendada */

Nagu juba näha, kasutatakse massiive sageli sümbolite jadade (stringide) salvestamiseks. Sümbolite jada vajab alati lõpumärgi jaoks ühe positsiooni rohkem, kui seda on stringi pikkus. Seda saab kasutada kiireks stringi tühjendamiseks. Kui esimesse positsiooni sisestada arv null, siis stringide jaoks loodud funktsioonid enam ei uurigi muude positsioonide väärtust.

Massiivid võivad sisaldada ka teisi massiive, s.o. olla mitmedimensionaalsed. Selleks lisatakse massiivi nimele veel ühed (või mitmed) kandilised sulud koos vastava elementide hulgaga, näiteks:

int M[4][2]; /* 4 x 2 massiiv */

Arvuti mälus salvestatakse selline n - dimensionaalne massiiv järjestikku, alustades kõige vasakpoolsemast dimensioonist. Massiiv M salvestatakse seega kui neli kaheliikmelist gruppi, näiteks: M(1,1), M(1,2), M(2,1), M(2,2), M(3,1), M(3,2), M(4,1), M(4,2).

Tuletatud tüüpide puhul eristatakse täieliku (complete) ja ebatäieliku (incomplete) definitsiooni vahel. Täieliku definitsiooni puhul märgitakse ära kõik antud tüübi vajalikud andmed. Üleval toodud näited sisaldavad vaid täielikke definitsioone.

Ebatäieliku definitsiooni puhul tuuakse vaid uue tüübi nimi või veel mõned andmed, kuid ei tooda küllaldaselt andmeid soovitud tüübi suuruse määramiseks. Massiivi puhul oleks ebatäielik näiteks selline definitsioon, mis ei sisalda massiivi elementide arvu. Ebatäieliku definitsiooni kasutamiseks on vaja elemendi suurus hiljem ikkagi kuidagi määrata. Näiteks:

char	Name[] = "Peeter";

Toodud näites jäeti stringi pikkus määramata, kuna me ta kohe täidame teatud kindla pikkusega konstandi abil ja seega on ka elemendi suurus määratud. Selles näites oleks elemendi pikkuseks 7 (6 tähte ja lõpumärgina null). Selle pikkuse arvutab translaator. Näidatud kujul salvestatakse programmis sageli vajalikke stringe, mille suurus ja sisu ei muutu. Võimalik oleks ju ka elemendi suurus kohe määrata, kuid selleks tuleks ise kõik sümbolid üle lugeda. Lihtsam on lasta seda teha translaatoril. Kui aga määrata element palju suurem kui vaja, siis raiskame asjatult ruumi. Ebatäielikku definitsiooni kasutatakse sageli ka funktsiooni parameetri tüübi määramiseks, et võimaldada anda üle suvalise suurusega parameeter.

Mitmedimensionaalsete massiivide puhul võib jätta määramata vaid esimese dimensiooni. Näiteks:

int nNumbers [][3];	/* n x 3 massiiv */