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:
-
tiny model: mind az adat-, mind a kódpointerek near
típusúak. Megkötés, hogy az összes adatnak
és programkódnak el kell férni egy 64 Kbyte-os memóriaszegmensben.
Az így fordított és szerkesztett programok .com
típusúvá alakíthatók át.
-
small model: mind az adat-, mind a kódpointerek near
típusúak. Megkötés, hogy az összes adatnak
el kell férni egy 64 Kbyte-os memóriaszegmensben, valamint
az összes programkódnak el kell férni egy másik
64 Kbyte-os szegmensben.
-
medium model: az adatpointerek near, a kódpointerek
far típusúak. Megkötés, hogy az összes
adatnak el kell férni egy 64 Kbyte-os memóriaszegmensben.
-
compact model: az adatpointerek far, a kódpointerek
near típusúak. Megkötés, hogy az összes
programkódnak el kell férni egy 64 Kbyte-os memóriaszegmensben,
valamint, hogy az összes statikus adatnak el kell férni egy
másik 64 Kbyte-os szegmensben.
-
large model: mind az adat-, mind a kódpointerek far
típusúak. Megkötés, hogy az összes statikus
adatnak el kell férni egy 64 Kbyte-os memóriaszegmensben.
-
huge model: mind az adat-, mind a kódpointerek far
típusúak.
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
Elõre: Az
elõfeldolgozó Fel: A
változók alaptípusai Vissza: A
lebegõpontos valós számok