Pointerarithmetic is een fundamenteel kenmerk van de C-taal dat het werken met geheugen flexibel maakt, maar ook potentieel gevaarlijk.
Pointerarithmetic ontstond vanwege de kenmerken van low-level talen en is gericht op het werken met arrays en het direct verwerken van gestructureerde gegevens in het geheugen. In C "weet" elke pointer de grootte van het type waarnaar hij wijst.
Veel ontwikkelaars maken de fout te denken dat een toevoeging van één aan een pointer het adres met precies één byte verhoogt. In werkelijkheid vindt de verhoging plaats met sizeof(type). Bij het werken met verschillende datatypes, vooral met structuren van verschillende groottes, is het gemakkelijk om fouten te maken bij geheugenovergangen. Ook is pointerarithmetic niet toegestaan met void* — dit is een standaardfout.
Alle rekenkundige handelingen met pointers houden rekening met de grootte van het bijbehorende type, wat de operaties met arrays maximaal efficiënt maakt. Bijvoorbeeld:
#include <stdio.h> int arr[4] = {10, 20, 30, 40}; int *p = arr; printf("%d\n", *(p + 2)); // Toont 30
Hier verschuift (p + 2) de pointer met 2 * sizeof(int) bytes vooruit, en niet gewoon met 2 bytes.
Belangrijke kenmerken:
Is het mogelijk om increment/decrement bewerkingen uit te voeren op pointers naar void?
Nee, de C-standaard verbiedt arithmetic met void*. Eerst moet de pointer naar een specifiek type worden geconverteerd, bijvoorbeeld (char*), en pas daarna kan de arithmetic worden uitgevoerd.
void *vp = arr; char *cp = (char *)vp; cp++;
Wat gebeurt er als je een waarde toevoegt aan een pointer naar een structuur of array die groter is dan de grootte van de array?
Dit zal leiden tot een overschrijding van het toegestane geheugen (undefined behavior). C controleert geen arraygrenzen — de verantwoordelijkheid ligt bij de programmeur.
Is het mogelijk om twee pointers direct bij elkaar op te tellen?
Nee, het optellen van pointers is verboden en heeft geen zin. Het is alleen toegestaan om het verschil tussen twee pointers die tot dezelfde array behoren af te trekken.
Een jonge ontwikkelaar, die werkt met een int-array via pointers, verschoof de pointer met een vast aantal bytes, waarbij hij de grootte van het type vergat.
Voordelen:
Nadelen:
Een ervaren ontwikkelaar gebruikt altijd uitdrukkingen zoals (ptr + n), vertrouwend op de compiler om de verschuiving op de grootte van het type te schalen.
Voordelen:
Nadelen: