Pointers

Een pointer is niks anders dan een variabele waar een geheugenadres in is opgeslagen waardoor je de mogelijkheid hebt om data te manipuleren door direct het geheugen aan te spreken. Hoewel het niet zo moeilijk lijkt valt dit toch nog zwaar tegen en hebben de meesten hier problemen mee. Als eerste een voorbeeldje met pointers om het je wat duidelijker te maken.

int main()
{
  int getal = 5; //variabele
  int *pgetal=0; //pointer

  pgetal = &getal; //zet het geheugenadres van getal in pgetal

  cout << *pgetal; //geef de waarde weer

  return 0;
}
Ik heb hier eerst een variabele en een pointer gemaakt waar de waarde 0 aan toe is gekend om fouten te voorkomen. De pointer is een variabele maar werkt niet helemaal hetzelfde omdat deze in plaats van een waarde een geheugenadres onthoud. De pointer is eigenlijk ook niet van het type int maar kan een geheugenadres van een integer bevatten (in plaats van een waarde). Nu moeten we dus een geheugenadres in de pointer zetten door de adres operator & te gebruiken met de variabele naam erachter waardoor het geheugenadres van getal in pgetal komt te staan. De pointer wijst dus naar een geheugenadres waar je bepaalde data hebt staan zoals hier waar pgetal naar getal wijst. Als je nu de waarde van getal wilt weten door je pointer te gebruiken doe je dit door de indirectie operator * waardoor de waarde van het getal automatisch opgehaald wordt alsof het een gewone variabele is.

Je kunt dus geen waarden aan pointers toekennen maar wel geheugen adressen. Wat je wel kunt doen is een waarde doorgeven aan een variabele door een pointer.


int main()
{
  int getal = 0; //variabele
  int *pgetal=0; //pointer

  pgetal = &getal; //zet het geheugenadres van getal in pgetal

  *pgetal=5;
  cout << getal; //geef de waarde weer

  return 0;
}
Hier wordt de waarde 5 doorgegeven aan de pointer die de waarde in het geheugenadres van getal zet, als je nu dan de waarde van getal op gaat vragen komt er dus 5 uit. Om het wat duidelijker te maken met al die adressen en waardes kun je dit het beste voor stellen als postvakjes in een flat die allemaal zijn ingedeeld in rijen met oplopende huisnummers. Als er nu een brief in postvak nummer 12 komt dan weet je dat je deze brief kunt lezen door in postvak nummer 12 te kijken. Met pointers is dit dus hetzelfde, je kijkt naar het adres in de pointer en haalt daar de informatie uit. Als je het nog niet begrijpt is dat niet zo erg want het is gewoon een moeilijk onderwerp en door oefening leer je vanzelf met pointers werken.

Waarom pointers?


Om je een idee te geven van waarom pointers gebruikt worden doe ik er nog een klein stukje bij met een voorbeeld waarvoor pointers gebruikt kunnen worden. Je weet dat als je variabelen binnen een functie gebruikt deze weg worden gegooit zodra de functie af is gelopen en ze niet meer kunt gebruiken binnen je programma. Je kunt natuurlijk ook globale variabelen maken die altijd bestaan zolang het programma actief is maar dus ook door elke functie kunnen worden verandert wat tot fouten kan leiden, maar er is nog een mogelijkheid. Door het gebruik van pointers kun je zorgen dat geheugen (en dus de informatie in dat geheugen) beschikbaar blijft totdat je het zelf weer vrijgeeft. Dit betekend dus dat je het geheugen dat je reserveert weer vrij moet geven zodat er geen data in blijft zitten en je een memmory leak krijgt. Je moet dus zorgen dat je het geheugen weer vrij hebt gegeven voordat de functie is afgelopen anders ben je namelijk de pointer kwijt waar het geheugenadres in stond wat je vrij moet geven.

Dit is wel weer genoeg theorie voor nu dus kijk maar even naar het volgende voorbeeldje over de vrije geheugenruimte.


int main()
{
   int *pgetal = new int;  //maak plaats in de vrije geheugenruimte d.m.v. new
   
   *pgetal = 7;            //zet het getal 7 in de vrije geheugenruimte

   cout << *pgetal;        //laat de waarde zien waar pgetal naar verwijst

   delete pgetal;          //maak de vrije geheugenruimte weer leeg
   
   return 0;               //sluit het programma af
}
Het eerste wat we hier doen is een pointer naar een int maken zoals we normaal zouden doen. Vervolgens maken we in de vrije geheugenruimte ruimte voor een int door het gebruik van new. Wat er gebeurt is dat new het geheugenadres retourneerd wat je dus direct in pgetal op kunt slaan, het kan dus ook zo.

int *pgetal
pgetal = new int;

Je hoeft dus geen & teken voor "new int" te zetten om het geheugen adres in pgetal te zetten. Je hebt nu dus via pgetal toegang tot de integer in de vrije geheugenruimte en kunt deze dus ook bewerken en ophalen door gebruik van de pointer zoals de volgende 2 regels laten zien. Als laatste moet je dan nog het geheugen weer vrijgeven.

Oja nog 1 ding, gebruik nooit delete als de pointer al leeg is anders crasht je computer zorg er dus voor dat als je de vrije geheugenruimte dus leeg hebt gemaakt je de pointer 0 maakt (*pgetal = 0;) waardoor je de pointer kunt deleten zo vaak je wilt zonder dat er iets gebeurt.

Zorg ervoor dat je dit goed begrijpt want pointers worden in alle programma's veel gebruikt.

Succes

Vampire,