© Harry Broeders.
Deze pagina is bestemd voor studenten van Hogeschool Rotterdam.
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
.
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 = 909090;
strcpy(s1.naam, "S. Lim");
s1.cijfer = 8.4;
s2.nummer = 890666;
strcpy(s2.naam, "D. Omkop");
s2.cijfer = 3.2;
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 = {909090, "S. Lim", 8.4}, s2 = {890666, "D. Omkop", 3.2};
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);
struct
. De hierboven gedeclareerde functie printstudent
kan als volgt
gedefinieerd worden:
void printStudent(Student s) {
printf("%07d %-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;
}
}