JGuntherS Geplaatst: 9 januari 2006 Rapport Geplaatst: 9 januari 2006 (bewerkt) 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 ) 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: 2 februari 2006 door JGuntherS Reageren
JGuntherS Geplaatst: 12 januari 2006 Auteur Rapport Geplaatst: 12 januari 2006 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! Reageren
Big-Bear Geplaatst: 12 januari 2006 Rapport Geplaatst: 12 januari 2006 Is dat als waren, een Variable op een Variable? Zoeits zoek ik namelijk. Reageren
JGuntherS Geplaatst: 12 januari 2006 Auteur Rapport Geplaatst: 12 januari 2006 Beide variabeles zijn met elkaar verbonden, ze schrijven naar het zelfde geheugenadres. Je kunt ook gewoon een geheugenadres (niet van een variabele) in een pointer stoppen. Reageren
Big-Bear Geplaatst: 13 januari 2006 Rapport Geplaatst: 13 januari 2006 Ah, zover ben ik niet, maar ik ben hard aan het EXperminteren, om te zoeken naar een Code, die zelf bepaald, welke van de 2e Messages Post Reageren
JGuntherS Geplaatst: 13 januari 2006 Auteur Rapport Geplaatst: 13 januari 2006 [offtopic]Dat moet je met If-blokken doen (VB) of met if-blokken (C/C++) (het enige vershil is die hoofdletter)[/offtopic] Reageren
Recommended Posts
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.