Structuren vs. Unions in C: Een Praktische Gids
Wat is een Structuur?
Een structuur is een door de gebruiker gedefinieerd datatype in C dat logisch gerelateerde data-items van verschillende typen in een enkele eenheid groepeert. Elk lid bezit zijn eigen aaneengesloten geheugenlocatie, zodat een structuur meerdere waarden tegelijk kan opslaan.
Voorbeeld: een studentenrecord die een naam, inschrijvingsnummer en cijfers onder één variabelenaam opslaat.
Wat is een Union?
Een union is ook een door de gebruiker gedefinieerd type, maar alle leden delen dezelfde geheugenruimte. De grootte van de union is gelijk aan de grootte van het grootste lid. Deze eigenschap maakt unions ideaal voor geheugenbeperkte scenario's waar slechts één lid tegelijk nodig is.
Een Structuur Declareren
struct Student {
char naam[60];
int inschrijvingsnummer;
float cijfers;
};
Let op het gebruik van het struct-sleutelwoord en de puntkomma na de sluitende accolade.
Voorbeeld: Een Structuur Gebruiken
#include <stdio.h>
struct Student {
char naam[60];
int inschrijvingsnummer;
float cijfers;
} sdt;
int main(void) {
printf("Voer de volgende informatie in:\n");
printf("Studentnaam: ");
fgets(sdt.naam, sizeof(sdt.naam), stdin);
printf("Inschrijvingsnummer: ");
scanf("%d", &sdt.inschrijvingsnummer);
printf("Cijfers: ");
scanf("%f", &sdt.cijfers);
printf("\nIngevoerde data:\n");
printf("Naam: %s", sdt.naam);
printf("Inschrijvingsnummer: %d\n", sdt.inschrijvingsnummer);
printf("Cijfers: %.1f\n", sdt.cijfers);
return 0;
}
Output (voorbeeld):
Voer de volgende informatie in: Studentnaam: James Inschrijvingsnummer: 21 Cijfers: 67 Ingevoerde data: Naam: James Inschrijvingsnummer: 21 Cijfers: 67.0
Een Union Declareren
union Item {
int x;
float y;
char ch;
};
Voorbeeld: Een Union Gebruiken
#include <stdio.h>
union Item {
int x;
float y;
char ch;
};
int main(void) {
union Item it;
it.x = 12;
it.y = 20.2f;
it.ch = 'a';
printf("x = %d\n", it.x);
printf("y = %f\n", it.y);
printf("ch = %c\n", it.ch);
return 0;
}
Omdat alle leden geheugen delen, overschrijft het instellen van ch de vorige waarden van x en y. Alleen de laatst opgeslagen waarde is geldig.
Structuur vs. Union
| Kenmerk | Structuur | Union |
|---|---|---|
| Declaratie-sleutelwoord | struct | union |
| Geheugenlayout | Elk lid krijgt eigen ruimte | Alle leden delen één ruimte |
| Eén lid wijzigen | Beïnvloedt andere niet | Overschrijft andere leden |
| Initialisatie | Alle leden tegelijk initialiseren | Alleen eerste lid kan geïnitialiseerd worden |
| Totale grootte | Som van alle lid-groottes | Grootte van grootste lid |
| Typisch gebruik | Gerelateerde data van verschillende typen opslaan | Eén van meerdere mogelijke typen opslaan |
| Toegangs-patroon | Elk lid op elk moment toegankelijk | Alleen één lid tegelijk geldig |
| Flexibele array-ondersteuning | Ondersteund | Niet ondersteund |
Wanneer Elk Te Gebruiken
- Structuur: Wanneer je meerdere gerelateerde velden tegelijk moet bijhouden, zoals een studenten- of werknemersrecord.
- Union: Wanneer je een waarde hebt die van verschillende typen kan zijn maar maar één tegelijk, zoals een variant-type of een geheugenbeperkte sensorwaarde.
Voor- en Nadelen
Structuur Voordelen
- Groepeert gerelateerde data onder één naam, verbetert leesbaarheid.
- Gemakkelijk om hele records aan functies door te geven.
- Arrays van structuren ermöglichen opslag van veel records.
- Ondersteunt flexibele arrays voor variabele-lengte data.
Structuur Nadelen
- Vereist meer geheugen, omdat elk lid opgeslagen wordt.
- Wijzigingen in de structuurdefinitie doorwerken door de hele code.
- Kunnen onwieldig worden in grote projecten diep geneste structuren.
Union Voordelen
- Minimaal geheugenvoetafdruk: alleen de grootte van het grootste lid.
- Nuttig voor het implementeren van typetags of variant-data.
- Kan code vereenvoudigen die een enkele waarde van varierend type gebruikt.
Union Nadelen
- Slechts één lid kan op een gegeven moment een geldige waarde houden.
- Moeilijker te debuggen door gedeeld geheugen.
- Kan geen flexibele arrays gebruiken.
C Taal
- Hardlossen vs. Solderen: Belangrijkste Verschillen Uitgelegd
- 2-Takt vs 4-Takt Motoren: Belangrijkste Verschillen Uitgelegd
- DC vs AC Motoren Begrijpen: Belangrijkste Verschillen en Kookgids
- Asbest vs. Glasvezel: Belangrijke Verschillen, Toepassingen en Veiligheidsoverwegingen
- C++ Struct vs Class: Belangrijkste Verschillen, Syntaxis en Beste Gebruikssituaties
- C# vs C++: Duidelijke Vergelijking van Kenmerken, Prestaties en Use Cases
- C vs. C++: Belangrijkste Verschillen & Wanneer Welke Te Kiezen
- C vs Java: Een uitgebreide vergelijking van functies, geschiedenis en toepassingen
- strlen() vs. sizeof() in C: Verschillen begrijpen en correct gebruik
- Python vs JavaScript: Belangrijkste Verschillen, Kenmerken en Wanneer Welke Te Kiezen
- Python vs Ruby: Uitgebreide Vergelijking van Features, Voordelen en Use Cases