A mutatók, vagy más néven pointerek a C nyelv fontos elemei. Ezek lehetÅ‘vé teszik a programok számára, hogy memóriát cÃmezzünk meg. A pointer nem más, mint egy numerikus érték, ami a memóriában egy változó memóriacÃmére mutat és lehetÅ‘vé teszi, hogy a mutatón keresztül közvetlenül módosÃtsuk az ott tárolt értéket. C# analógiával élve mondhatnánk, hogy a pointerek referenciák, de itt alacsonyabb szintű, tényleges memóriacÃmre mutatásról van szó. A pointerek esetén itt is van null érték, amire a NULL konstanssal tudunk hivatkozni. Kivételkezelés hiányában ha egy NULL érték kerül egy olyan változóba, amiben a kód erre nem számÃt, akkor fordÃtó függÅ‘, hogy mi fog történni, mert szintén undefined behavior a NULL mutató dereferálása.
Nézzük meg, hogy hogyan is tudunk mutatót készÃteni:
#include <stdio.h>
int main()
{
/*Egy egész tÃpusú változó*/
int x = 10;
/*pointer létrehozása x változó cÃmével*/
int *pointer = &x;
/*A pointer által mutatott memória átÃrása*/
*pointer = 20;
printf("pointer memoria cim: %d\r\n", pointer);
printf("pointer memoria cim: %p\r\n", (void*)pointer);
printf("pointer erteke: %d\r\n", *pointer);
printf("x: %d\r\n", x);
return 0;
}
A program kimenete valami hasonló lesz:
pointer memoria cim: 2132803140
pointer memoria cim: 000000777f1ffe44
pointer erteke: 20
x: 20
A kódban x egy normál változó, amit inicializálunk 10 értékkel. Ezt követÅ‘en a pointer változó attól lesz mutató, hogy a * operátor szerepel a neve elÅ‘tt. Ennek x változó memóriacÃmét adjuk értékül. Egy változó memóriacÃmét a neve elÅ‘tt alkalmazott & operátorral tudjuk elkérni.
Ezt követÅ‘en a pointer változó által mutatott memóriacÃmre beÃrunk egy 20 értéket, ami valójában az x változó memória területét fogja módosÃtani. Ennél a műveletnél szintén fontos szerepe van a * operátornak. Ennek hiányában a pointer által mutatott memóriacÃmet állÃtanánk 20-ra és nem az értékét.
Ha véletlenül a pointer cÃmét Ãrjuk át és nem az értékét, akkor addig nincs baj, amÃg ezek után nem de-referáljuk a pointert, mivel ez undefined behaviour. Éppen ezért, egy pointer által mutatott cÃmet kézzel sose módosÃtsunk, mivel nem biztos, hogy a megadott memóriacÃm tartalmát lesz jogosultságunk kiolvasni vagy ha van is, nem biztos, hogy az van ott, amire számÃtunk és a programunk megfelelÅ‘ felkészültség hiányában össze fog omlani.
A program kimenetbÅ‘l látható, hogy ugyan a %d formázásos kiÃrás működik a pointer cÃmekre, de nem sok hasznos információt szolgáltat, mivel decimális formázást kapunk. Azonban, ha a %p formátumot alkalmazzuk, akkor hexadecimális kiÃrást kapunk. Jelen esetben 64 bitre kiegészÃtve, mivel 64 bites fordÃtóval készült a program.