C-pointers: Praktische stappen naar geavanceerd programmeren
Wat is een pointer?
& operator). Pointers maken dynamisch geheugenbeheer, arrays, strings en efficiënte functie-argumenten mogelijk.
Declaratie
type *naam;
Voorbeelden:
int *ip; // pointer naar int double *dp; // pointer naar double float *fp; char *ch; // pointer naar char (string)
Alle pointers hebben dezelfde grootte (adresgrootte), maar het basistype bepaalt rekenkunde en dereferentie.
Basisoperaties
- Declareren:
int *ip; - Adres toewijzen:
ip = &var; - Derefereren (waarde opvragen/wijzigen):
*ip = 20;ofprintf("%d", *ip);
Voorbeeld
#include <stdio.h>
int main() {
int var = 20;
int *ip = &var;
printf("Adres van var: %p\n", (void*)&var);
printf("Adres in ip: %p\n", (void*)ip);
printf("Waarde via *ip: %d\n", *ip);
*ip = 30; // wijzig via pointer
printf("Nieuwe waarde var: %d\n", var); // 30
return 0;
}
NULL pointers
Pointer die naar niets wijst. Goede gewoonte: initialiseer op NULL (gedefinieerd in <stdio.h>, <stdlib.h>, etc.).
int *ptr = NULL;
if (ptr) { /* niet null */ }
if (!ptr) { /* is null */ }
Adres 0 is gereserveerd voor OS; derefereren van NULL → crash (segmentation fault).
Pointer-rekenkunde
Alleen ++, --, +, - toegestaan. Stapgrootte = grootte van basistype.
int arr[5] = {10, 20, 30, 40, 50};
int *p = arr; // p wijst naar arr[0]
printf("%d\n", *p); // 10
printf("%d\n", *(p+2)); // 30
p++; // p wijst naar arr[1]
Geavanceerde pointer-concepten
| Concept | Beschrijving |
|---|---|
| Array van pointers | int *ptrs[10]; – array van 10 int-pointers |
| Pointer naar pointer | int **pp; – voor 2D arrays, functies die pointer wijzigen |
| Pointers doorgeven aan functies | Call by reference: functie kan argument wijzigen |
| Pointer retourneren | Functie retourneert adres (van static, malloc, of parameter) |
| Functiepointers | int (*funcPtr)(int, int); – voor callbacks, state machines |
Dynamisch geheugenbeheer
<stdlib.h> functies:
malloc(size)– reserveert ongeïnitialiseerd geheugencalloc(n, size)– reserveert en nul-initialiseertrealloc(ptr, new_size)– vergroot/kleinfree(ptr)– geeft geheugen vrij
int *arr = malloc(10 * sizeof(int));
if (arr == NULL) { /* foutafhandeling */ }
arr[0] = 42;
free(arr); // verplicht!
Veelvoorkomende fouten: ongeïnitialiseerde pointers, derefereren van NULL/vrije geheugen, geheugenlekken (geen
free), buffer overruns.
C Taal
- C Variabelen, Constanten en Literals: Een Complete Gids
- C-opslagklassen begrijpen: Bereik, levensduur en prestaties
- C-pointers onder de knie krijgen: Een praktische, expert-gids
- De relatie tussen arrays en pointers in C begrijpen
- C-programmeren: Adressen & pointers doorgeven aan functies – Een praktische gids
- C Structs en Pointers onder de knie krijgen: Een praktische gids
- C++ Pointers Onder de Knie: Concepten, Voorbeelden & Praktische Toepassingen
- C Variabelen, Datatypes en Constanten – Een Praktische Gids
- Pointers in C: Een Uitgebreide Gids naar Typen, Gebruik en Best Practices
- Verilog-toewijzingen begrijpen: types, syntax en best practices
- Python's Global Keyword onder de knie krijgen: Hoe en wanneer te gebruiken