Het gebruik van structs.

© Harry Broeders.

Deze pagina is bestemd voor studenten van de Haagse Hogeschool - Academie voor Technology, Innovation & Society Delft.

In C kan een aantal variabelen die bij elkaar horen gegroepeerd worden in een struct of in een array. In een array moeten alle elementen van hetzelfde type zijn (omdat het anders niet mogelijk is om het adres van het nde element te berekenen). Een element uit de array wordt geselecteerd met behulp van een index. Het eerste element heeft index 0, het tweede element index 1 enz. In een array genaamd rij kunnen we het derde element selecteren met de expressie rij[2]. In een struct kunnen de elementen van verschillende typen zijn. Een element uit de struct wordt geselecteerd met behulp van een naam (veldnaam). In een struct genaamd s1 kunnen we het element genaamd nummer selecteren met de expressie s1.nummer.

Definiëren van een struct.

Een struct kan als volgt gedefinieerd worden:

struct student {
    int nummer;
    char naam[20];
    float cijfer;
};

Vervolgens kunnen variabelen van dit struct type worden aangemaakt (zie: struct1.c ):

int main(void) {
    struct student s1, s2;
    s1.nummer = 15080234;
    strcpy(s1.naam, "S. Lim");
    s1.cijfer = 8.4;
    s2.nummer = 15080323;
    strcpy(s2.naam, "D. Omkop");
    s2.cijfer = 3.4;

Als je de struct alleen in main gebruikt kun je de struct ook lokaal definiëren:

int main(void) {
    struct student {
        int nummer;
        char naam[20];
        float cijfer;
    };
    struct student s1, s2;

In dit geval mag je de declaratie van de struct en de definitie van de variabelen combineren:

int main(void) {
    struct student {
        int nummer;
        char naam[20];
        float cijfer;
    } s1, s2;

Omdat je nu de naam van de struct niet meer nodig hebt kun je die ook weglaten:

int main(void) {
    struct {
        int nummer;
        char naam[20];
        float cijfer;
    } s1, s2;

Je kunt een struct variabele (net zoals een array variabele) bij het aanmaken meteen vullen (zie: struct2.c ):

int main(void) {
    struct {
        int nummer;
        char naam[20];
        float cijfer;
    } s1 = {15080234, "S. Lim", 8.4}, s2 = {15080323, "D. Omkop", 3.4};

In de praktijk wordt een struct vaak globaal geclareerd en zijn er veel functies waarbij dit struct type als parameter wordt gebruikt:

struct student {
    int nummer;
    char naam[20];
    float cijfer;
};

struct student leesStudent(void);
void geefCijfer(struct student *ps, float c);
void printStudent(struct student s);

In dit geval is het handig om een typedef te gebruiken. Met een typedef kunnen we een alias voor een bestaand type definiëren:

struct student {
    int nummer;
    char naam[20];
    float cijfer;
};
typedef struct student Student;
Student leesStudent(void); void geefCijfer(Student *ps, float c); void printStudent(Student s);

In dit geval kan de declaratie van de struct en de definitie van de typenaam worden gecombineerd:

typedef struct student {
    int nummer;
    char naam[20];
    float cijfer;
} Student;

Student leesStudent(void);
void geefCijfer(Student *ps, float c);
void printStudent(Student s);

Omdat je nu de naam van de struct niet meer nodig hebt kun je die ook weglaten (zie: struct3.c ):

typedef struct {
    int nummer;
    char naam[20];
    float cijfer;
} Student;

Student leesStudent(void);
void geefCijfer(Student *ps, float c);
void printStudent(Student s);

Gebruiken van een struct.

De hierboven gedeclareerde functie printstudent kan als volgt gedefinieerd worden:

void printStudent(Student s) {
    printf("%5d %-20s %4.1f\n", s.nummer, s.naam, s.cijfer);
}

De hierboven gedeclareerde functie geefCijfer kan als volgt gedefinieerd worden:

void geefCijfer(Student *ps, float c) {
/* hoogste cijfer telt:*/
    if (c > (*ps).cijfer) {
        (*ps).cijfer = c;
    }
}

Omdat de variabele ps een Student* is moet het element cijfer van de struct waar deze pointer naar wijst geselecteerd worden met de expressie (*ps).cijfer. De haakjes zijn nodig omdat de operator . een hogere prioriteit heeft dan de operator *. Deze vervelende notatie mag je ook afkorten met ps->cijfer.

void geefCijfer(Student *ps, float c) {
/* hoogste cijfer telt:*/
    if (c > ps->cijfer) {
        ps->cijfer = c;
    }
}