Programmeringsspråket C

Arrays

Vad är en array?

Arrays har många namn på svenska, däribland lista, fält, vektor, serie. Delvis därför föredrar vi att kalla det för array, eftersom det är mer konsistent och inte lika lätt att blanda ihop med annat. En array är på ett ungefär en sorts med möjlighet att lagra flera värden, istället för bara ett. En array kan användas så här:

int tallista[4];
tallista[2] = 17;

Den första raden initialiserar en array med 4 platser. Den andra raden sätter värdet på plats nummer tre till 17.

Varning! Nej, det var inte ett misstag i den tidigare meningen. När man initialiserar en array anger man inom hakparenteserna antalet platser man vill allokera (reservera). När man efter det försöker komma åt en plats, anger man platsens nummer, räknat från noll. lista[0] motsvarar således första platsen, lista[78] motsvarar således 79:de platsen.

Varning! Kompilatorn kommer inte bry sig om vilken plats i arrayen du försöker komma åt. Om du i övre exemplet skulle lägga till raden tallista[4] = 19 (kom ihåg att det är plats 5, i en array med endast 4 platser) så är beteendet oförutsägbart, och det är en vanlig källa till att programmet kraschar. Anledningen är att man försöker komma åt en position i minnet som man inte har rätt till att komma åt. Detta fel går under namnet segmentation fault (eller förkortat segfault).

Det smidiga med arrays ligger i flera grejer. Den kanske mest uppenbara är att en array alltid lagras som en lång följd, så all data hänger samman. Den andra är att man snabbt kan loopa igenom alla positioner, och utföra operationer på datan. Föreställ dig följande exempel, där allt är gjort i variabler.

int variabel0, variabel1, variabel2, variabel3, variabel4, variabel5, variabel6, variabel7;
variabel0 = 0;
variabel1 = 0;
variabel2 = 0;
variabel3 = 0;
variabel4 = 0;
variabel5 = 0;
variabel6 = 0;
variabel7 = 0;

Det är inte smidigt, och inte snyggt. Man kan börja med att konvertera serien till en array, och få lite smidigare kod.

int serie[8];
serie[0] = 0;
serie[1] = 0;
serie[2] = 0;
serie[3] = 0;
serie[4] = 0;
serie[5] = 0;
serie[6] = 0;
serie[7] = 0;

Dock nyttan med att det är en array demonstreras i följande kod. Man kan se att det faktiskt går att loopa igenom en array, eftersom man anropar varje plats i arrayen med ett index-tal (talet mellan hakparenteserna).

int serie[8];
int index;
 
for (index = 0; index <= 7; index++) {
    serie[index] = 0;
}

Eftersom du känner till loopar sen förra delen kan du följa vad som händer i den här loopen.

Varning! Det går absolut att ha en variabel som index-tal precis som vi gjorde här med index, men den variabeln måste vara av heltalstyp, alltså antingen char eller int. (Ja, char är av heltalstyp, mer om det senare.)

För att ha med ett praktiskt kodexempel här också. Följande kod läser in 5 tal till en array, och sedan räknar ut medelvärdet av dem.

#include <stdio.h>
 
int main() {
    int termer[5], medelvarde = 0;
    int n;
 
    for (n = 0; n <= 4; n++) {
        printf("Skriv in tal %i: ", n);
        scanf("%i", &termer[n]);
    }
 
    for (n = 0; n <= 4; n++) {
        medelvarde += termer[n];
    }
    medelvarde /= 5;
 
    printf("Medelvärdet av ");
    for (n = 0; n <= 4; n++) {
        printf("%i ", termer[n]);
    }
    printf("är: %i", medelvarde);
 
    return 0;
}

Varning! Den uppmärksamme noterar här att medelvärdet inte alltid stämmer. När en division mellan två heltal utförs (som i det här fallet), så kommer C utföra en heltalsdivision, vilket i praktiken innebär att den dividerar som man önskar, men sen tar bort alla decimaler. 19 / 10 (heltalsdivision) blir på så sätt 1. Vilket ju är helt fel. Senare kommer vi ta upp mer om typer och typfel, då kommer det här upp i mer nogrannhet.

I övrigt, bekanta dig med arrays, de är effektiva hjälpmedel, och arrayer kommer tillbaks senare. Både i delarna om strängar och pekare.

← Loopar

Char-typen →

Copyleft kqr & slaeshjag 2009, 2012 some rights reserved