Pointers in C
Arnout van Kempen over rommelen in een digitale wereld.
Wie begint met programmeren, leert al snel over variabelen. Je leert dan zoiets als dat een variabele als het ware een doosje is waar een waarde in zit. Dat is best een mooi beeld en het kan helpen te begrijpen wat met een variabele gebeurt. In C heeft een variabele een type, dat aangeeft wat voor soort informatie de variabele kan bevatten. Bijvoorbeeld een int, een integer dus. Dat is dan een geheel getal. Een variabele moet in C gedeclareerd worden voor je er iets mee kan doen. En het is wel zo handig er ook een waarde, of een inhoud, aan te geven voor je er iets mee gaat doen. De computer geeft er anders immers een willekeurige inhoud aan.
Probeer maar eens in een programma het volgende:
int a;
printf("de waarde van a is %d", a);
Je zal van de compiler een waarschuwing krijgen, maar het werkt wel. Maar wat de uitkomst is valt niet te voorspellen.
Je mag de variabele direct bij de declaratie al een waarde meegeven; je mag dat ook later doen. Dus als je bovenstaande code zou uitbreiden met int a=10; dan ben je er al.
Je zal in C veel met functies werken, functies die je zelf schrijft. En dan wordt het beeld van een variabele als een doosje snel problematisch. Want in C wordt aan een functie niet "het doosje" doorgegeven, maar de waarde in dat doosje. Binnen de functie kan je met de variabele die je hebt doorgegeven dus niets. Maar het kan wel lijken dat dat kan en dan heb je dus een probleem.
De aanroep van functie f met f(a), als a = 10, wordt uitgevoerd als f(10). Binnen f heeft a dus geen betekenis, allen de waarde is bekend. Maar je zal a wel benoemd hebben in de beschrijving van f, en dus krijg je geen foutmelding. Alleen, er gebeurt niets met de variabele a uit de aanroepende functie. Het doosje is niet meegegeven aan de functie.
In C denk ik dat je het beeld van het doosje los moet laten. Een variabele is niets anders dan een korte naam voor een geheugenadres. Op dat adres staat een waarde en als je de variabele in een programma benoemt, krijg je de waarde op dat adres. Wel zorgt C er voor dat dat adres voor jouw variabele gereserveerd blijft, zodat andere programma’s er af blijven. Maar meer dan dat is een variabele niet en je kan met de variabele zelf dus ook niet zo veel.
Als je aan een functie niet wil vertellen wat de waarde van een variabele is, maar je wil als het ware de variabele zelf doorgeven, dan zal je het adres van de variabele moeten doorgeven. Dat adres wordt in C een pointer genoemd. Je kan variabelen maken van het type pointer en je kan de pointer, dat is dus een waarde, van een variabele ophalen. Een pointer heeft als type het type van de onderliggende variabele en begint met een *. En de pointer van een gewone variabele haal je op door een & voor de naam van de variabele te zetten.
Als je dat snapt, moet je kunnen voorspellen wat exact de uitkomst gaat zijn van de volgende code:
#include <stdio.h>
void plus_fout(int var)
{
var=var+1;
}
void plus_goed(int *var)
{
*var=*var+1;
}
int main()
{
int a=10;
plus_fout(a);
printf("De waarde van a na plus_fout is %d\n", a);
plus_goed(&a);
printf("De waarde van a na plus_goed is %d\n", a);
return 0;
}
Lukt dat niet, probeer het dan gewoon. De code staat op github.
Gerelateerd

De TSR en protected mode
Arnout van Kempen over rommelen in een digitale wereld.

IBM-pc en MS-DOS
Arnout van Kempen over rommelen in een digitale wereld.

Nogmaals ons programmaatje
Arnout van Kempen over rommelen in een digitale wereld.

De uitdagingen van de 8086
Arnout van Kempen over rommelen in een digitale wereld.

Programmeren van de 8080
Arnout van Kempen over rommelen in een digitale wereld.