Jump to content

C/C++ pointers


JGuntherS

Recommended Posts

Een groot deel van de kracht van C/C++ ligt in pointers. Pointers zijn een speciale variabeles, met eigenlijk 2 waardes. Pointers verwijzen naar andere variabeles. De twee waardes van een pointer zijn het geheugenadres waarnaar toe verwezen wordt, en de inhoud van dat geheugenadres.

Er schuilt ook een gevaar in pointers, als je ze verkeerd gebruikt, kun je verkeerde dingen in het RAM zetten, en je computer zelfs laten crashen. (Altijd leuk, het geheugen van je vervelende broertje/zusje volschrijven met nulletjes :D )

Aanwijzingen voor gebruik met C#: Als je dit in C# wilt doen, moet je de het deel (context) waarin je pointers wilt gebruiken 'unsafe' maken. Dat doe je door 'unsafe' voor de declaratie van je functie te zetten.

Basisbeginselen van pointers, geldt voor C en C++

Zo declareer je een pointer:

int *pTesti; //pointer voor een integer
int i; //gewone integer
float *pTestf; //pointer voor een float
float f; //gewone float

Zo zet je een geheugenadres van 'i' in 'pTesti':

pTesti = &i;

& is de "adres van" operator, hij geeft het adres terug van de variabele.

Zo wijzig je 'pTesti':

*pTesti = 56;

Nu zal 'i' ook 56 bevatten. Hetzelfde geldt natuurlijk voor floats, shorts, size_ts en alle andere soorten variabeles, zelfs zelfgemaakte ( struct lala {int pit;}; )

Pointers naar classes, geldt alleen voor C++

In C++ worden pointers ook vaak gebruikt voor classes, zo declareer je meestal een class:

Class *pT;

pT = new Class();

De 'new' operator geeft een pointer naar een geconstructueerde class terug. Als een class niet kon worden geconstructureerd geeft 'new' en null-pointer terug. Een null-pointer is een pointer die nergens naar verwijst.

Zo kun je testen of alles goed gegaan is:

Class *pT;

pT = new Class();

if (pT == NULL)
{
//Hier je fout-afhandeling, meestal een return FALSE of zoiets
}

Om de class later weer uit het geheugen te verwijderen, gebruik je

delete pT;

Dit was het wel zo'n beetje, als er nog iets bij moet of als ik iets vergeten/verkeerd gezegd heb, post je maar!

Bewerkt: door JGuntherS
Link to comment
Delen op andere websites

Malloc, calloc en free, geldt voor C en C++

Malloc

Malloc betekent 'Memory Allocation' oftewel 'geheugentoewijzing'. Om malloc te gebruiken moet je bepaalde headers 'includen', in je bestand opnemen. Je moet '<stdlib.h>' includen. Om dat te doen moet je dit aan het begin van je bestand zetten:

#include <stdlib.h>

Zo ziet de definitie van malloc eruit:

void *  malloc ( size_t size );

Size is de grootte van het op te vragen geheugenblok, size_t is meestal gewoon een typedef (een synoniem) voor unsigned int. Hij geeft een pointer terug naar het toegewezen geheugenblok. Als er iets misging geeft hij een nullpointer terug.

Er is een hele handige operator om de grootte van een variabele te bepalen, sizeof. Als je sizeof(int) doet, geeft hij het aantal bytes dat het type int in het geheugen opneemt aan (meestal 4).

Voorbeeld voor C:

int *pI;

pI = malloc(sizeof(int));

In C++ moet je de teruggeven pointer eerst omzetten (casten) naar het type variabele dat je in het blok wilt zetten.

Voorbeeld voor C++ en C, met cast:

int *pI;

pI = (int *) malloc(sizeof(int));

Het dikgedrukte deel is de cast, let op, vergeet het sterretje niet (dat betekent pointer)!

Calloc

Met calloc kun je een array van een bepaalde grootte opvragen.

Zo ziet de definitie van calloc eruit:

void *  calloc ( size_t num, size_t size );

num is het aantal op te vragen elementen, size is de grootte per element.

Alles wat voor malloc geldt, geldt ook voor calloc. Calloc is volgens mij niet veel meer dan:

void *  calloc ( size_t num, size_t size );
{
 return malloc(num * size);
}

Free

Met free maak je een eerder toegewezen geheugenblok weer klaar om opgevraagd te worden, door of je eigen programma of een ander programma. Dit is heel belangrijk! Alsje dat vergeet, zal het programma steeds meer geheugen opvragen, en je computer op een gegeven moment laten crashen.

Zo ziet de definitie van free eruit:

void  free ( void * memblock );

*memblock is een pointer naar een geheugenblok dat vrijgemaakt moet worden. Hij heeft geen resultaatwaarde, het kan gewoon niet misgaan :)

Voorbeeld voor C++ en C, met cast:

int *pI;

pI = (int *) malloc(sizeof(int));

*pI = 3;
if (*pI == 3)
{
*pI = 6;
}

free(pI);

Let op waar de sterretjes staan!

Oke, dat was het wel weer, heb je nog vragen/suggesties/fouten/iets anders? Post het!

Link to comment
Delen op andere websites

Een reactie plaatsen

Je kan nu een reactie plaatsen en pas achteraf registreren. Als je al lid bent, log eerst in om met je eigen account een reactie te plaatsen.

Gast
Op dit onderwerp reageren...

×   Je hebt text geplaatst met opmaak.   Opmaak verwijderen

  Only 75 emoji are allowed.

×   Je link is automatisch ingevoegd.   In plaats daarvan weergeven als link

×   Je vorige bewerkingen zijn hersteld.   Alles verwijderen

×   You cannot paste images directly. Upload or insert images from URL.

  • Recent actief   0 leden

    • Er zijn hier geen geregistreerde gebruikers aanwezig.
×
×
  • Create New...