next up previous contents
Elõre: Az elõfeldolgozó Fel: A változók alaptípusai Vissza: A lebegõpontos valós számok

A mutató típusok

A mutatók (pointerek) olyan változók, amelyek egyes tárolási egységek (változók vagy függvények) memória címeit tartalmazzák. Az ilyen változók tehát az adott tárolási egységre nem közvetlenül utalnak, hanem közvetetten (indirekció). A C nyelv ereje - többek között - éppen a mutatók kezelésében és a velük végzett mûveletekben rejlik (lásd késõbb a 1.9 részben). Ennek egyik forrása, hogy a pointer változókról nemcsak annyit tart nyilván a fordító, hogy ez egy mutató és hogy milyen méretû (16 vagy 32 bites), de azt is feljegyzi és követi, hogy a kérdéses változó vagy kifejezés milyen típusra mutat. Ezért valójában a C nyelvben nincs olyan alaptípus, hogy "mutató típus", csak olyan típusok vannak, mint páldául "mutató egy rövid egészre", "mutató egy elõjel nélküli karakterre", vagy akár "mutató egy olyan mutatóra, amelyik egy double értékkel visszatérõ, két elõjel nélküli long paramétert váró függvényre mutat". Azt, hogy ez igazából nem is bonyolult, azzal bizonyítjuk, hogy illusztrálásként megadunk egy definíciót az utolsó típusba tartozó dfuncptrs nevû változóra:
           double (**dfuncptrs)(long, long);
A fenti példákból az is kitûnik, hogy a pointerek tárterület foglaló és kódgeneráló program egységekre egyaránt mutathatnak. Az elõbbieket adatpointereknek, az utóbbiakat kódpointereknek nevezzük. A mutatók a BORLAND C++ rendszerben - illeszkedve a 8086-os mikroprocesszor felépítéséhez - 16, illetve 32 bit hosszúak lehetnek. A 16 bites mutatók neve near pointer, a 32 bitesek pedig további két csoportra oszlanak, a far pointerekre és a huge pointerekre. Egy near pointerrel legfeljebb 64 Kbyte tárterület címezhetõ meg, far és huge pointerrel a teljes 1 Mbyte-os adattár elérhetõ, de far pointerek esetében a megcímzett tárolási egység (például tömb) mérete nem lehet nagyobb, mint 64 Kbyte, míg a huge pointerekre semmilyen megkötés nincs. Ennek megfelelõen az egyes mutatókkal való mûveletvégzés bonyolultsága és végrehajtási ideje a fentiek szerint rohamosan nõ. Azért, hogy a felhasználó az adott feladat igényei szerint optimális megoldást választhasson, a BORLAND C++ hat ún. memóriamodellt bocsát a felhasználók rendelkezésére. Ezek a következõk: Figyeljük meg, hogy a huge modell nem használ huge pointereket! A másik megjegyzésünk, hogy kódpointerben a huge típusra soha sincs szükség, mert egyéb megkötések miatt egyetlen függvény sem lehet 64 Kbyte-nál nagyobb. Ugyanez a megkötés vonatkozik a modulokra is, azaz sem az egy modulban definiált programkód, sem az ott definiált statikus adatterület nem haladhatja meg a 64 Kbyte-ot. A memóriamodell kiválasztását egy program írása során minden modul fordításakor célszerû ellenõrizni. Linkeléskor az integrált rendszer automatikusan gondoskodik róla, hogy a megfelelõ modellû indító (ún. startup) kód és rendszerfüggvények legyenek beszerkesztve. Lehetõség van továbbá arra is, hogy tetszõleges memóriamodell használata esetén bizonyos mutatókat explicit módon near-nek, far-nak, vagy huge-nak deklaráljunk, sõt, ez az egyetlen lehetõség a huge pointerek használatára. A mutatókkal a 1.9-as részben foglakozunk részletesen.
 

Típus Méret 
(bitben)
Értéktartomány Pontosság (decimális jegyben)

unsigned 8 0 .. 255
char 8 -128 .. 127
enum 16 -32768 .. 32767
unsigned int 16 0 .. 65535
short int 16 -32768 .. 32767
int 16 -32768 .. 32767
unsigned long 32 0 .. 4294967295
long 32 -2147483648 .. 2147483647
float 32 3.4 10-38 .. 3.4 1038 7
double 64 1.7 10-308 .. 1.7 10308 15
long double 80 3.4 10-4932 .. 1.1 104932 19
near pointer 16
far pointer 32

  1.2 táblázat: Adattípusok, méretek és értéktartományok a BORLAND C++-ban


next up previous contents
Elõre: Az elõfeldolgozó Fel: A változók alaptípusai Vissza: A lebegõpontos valós számok