next up previous contents
Elõre: Mutatók függvényparaméterként Fel: Mutatók és tömbök Vissza: A mutatók használata

Értékadás mutatóknak

Egy mutató értéket olyan értékadáson keresztül kaphat, ahol a jobb oldalon álló kifejezés típusa megegyezik a mutatóéval. Pointer típusú kifejezést legegyszerûbben az egyoperandusú & operátor (address of operátor) segítségével készíthetünk, vagyis konkrétan megadva azt, hogy a mutató milyen változóra mutasson, például (a 1.9.1 deklarációit feltételezve):

           ptr = &i;
           pptr = &ptr;
Speciális eset, ha függvény címét akarjuk beírni egy pointerbe. A fordító ilyen esetben nem igényli az & operátor alkalmazását (sõt, figyelmeztetõ üzenetet is ad érte), ugyanis definíció szerint egy függvényazonosító az õt követõ paraméterzárójelek nélkül az adott függvény címét jelenti. Helyes tehát a következõ értékadás:
            pfunc = func;
Mutató típusú kifejezés elõállításának másik módja az, hogy korábban értékkel feltöltött pointer(ek)bõl megfelelõ mûveletekkel állítjuk elõ. A pointereken végezhetõ aritmetikát rövidesen ismertetni fogjuk, itt csak legegyszerûbb esetként tekintsük a szimpla értékadást:
            *pptr = ptr;
A leggyakrabban alkalmazott módszer mutatók feltöltésére a dinamikus területfoglalás során nyert címek felhasználása. A BORLAND C++ több standard könyvtári függvényt is rendelkezésünkre bocsát, amelyekkel futási idõben lehet tárterület foglalást végezni. Ezek közül a legegyszerûbb a malloc, amely paraméterként a lefoglani kívánt terület nagyságát várja (sizeof egységben). Az általa visszaadott érték (megfelelõ típuskonverzió után) bármilyen pointernek átadható. Például a
            ptr = (short *)malloc(sizeof(short));
hívás hatására futási idõben a tárkezelõ eljárás lefoglal egy akkora területet a memóriából, ahol egy rövid egész típusú adat elfér, majd az így kapott terület címe beíródik ptr-be. A lefoglalt területet azután a pointeren keresztül tetszés szerint manipulálhatjuk, éppúgy, mintha az eddig megszokott módon hoztunk volna létre egy short változót. A futási idõben történõ területfoglalás elõnye, hogy pontosan az igényeknek megfelelõ méretû területet vehetjük birtokba. Ennek elsõsorban a dinamikus tömböknél (például karakterláncoknál) van nagy jelentõsége.

Mutatóknak történõ értékadásnál kiemelt jelentõsége van a NULL szimbólumnak. (Ez a szimbólum többek között az stdio.h standard include file-ban van definiálva). Az a mutató, amely NULL értéket kapott, úgy tekintendõ, mint egy sehova sem mutató pointer, és a NULL garantáltan megkülönböztethetõ minden legális címtõl. A malloc is NULL értékkel tér vissza, ha a területfoglalási kérelmet nem tudja teljesíteni. A NULL minden létezõ megvalósításnál a 0 érték (vagy inkább a (void*)0 érték), de portabilitási és stiláris okokból elõnyben kell részesíteni a NULL szimbólum használatát. A fenti területfoglaló példát is a következõképpen illik "tisztességesen" megvalósítani:

          if ((ptr = (short *)malloc(sizeof(short))) == NULL)
          {
           a memóriafoglalási hiba lekezelése
          } /* endif */

next up previous contents
Elõre: Mutatók függvényparaméterként Fel: Mutatók és tömbök Vissza: A mutatók használata