Tipuskonvertálás hogyan?
Tudom nem sokat mondó a kérdés de azt érdekelne engem hogy egy pointert tipusu változó értékét egy intiget számmá konvertálni?
Olyanra gondolok pl.:
int a = 5;
int* Pa = &a;
és ezt a Pa pointert int számmá konvertálni.
pl ha az "a" karakter értéke intiger tipusba mondjuk 2 akkor char tipusban a 2 az "a" karaktert jelöli.
*Pa
Viszont nem tudom, hogy jön ide a char, mag az "a" karakter.
Intiget, intiger? Integer.
Ez még nem típuskonverzió, csak a pointer által tárolt memóriacím alatt lévő értéket kérdezi le: *Pa.
A fogalmazási készséged hagy még kívánni valót, de megértettem azért, hogy mire gondolsz az 'a' karakterrel. Azt sem kell konvertálnod, egyszerűen: int i = 'a'. De ha nagyon ragaszkodsz a castoláshoz: int i = (int)'a'.
Memory management basics:
Ha csinálsz egy ilyet:
int i = 5;
Akkor létrejön egy memóriaterület, amit elnevezünk "i"-nek, és arra a memóriaterületre beírjuk, hogy 5.
A processzor a memóriát bájtonként címzi meg. A memória a 0. bájton kezdődik. Nem tudom, mennyire gondolkodtál el rajta, hogy miért kell 64 bites rendszer, ha 4 GB-nál több memóriát akarsz a gépbe pakolni, de ez most mellékes. Jogos, ha egy memóriaterületet lefoglaltál, akkor meg tudod kérdezni, hogy a memóriában hányadik bájtnál kezdődik a lefoglalt terület. Erre lesz jó az & unáris operátor, például:
&i
Ezzel megkaptad azt az információt, hogy az i változód a memóriában melyik bájton kezdődik. De nem érzed azt, hogy ez egy kicsit hiányos információ? Nem kellene tudnod, hogy mégis hány bájton fér el az adat? Nos, ezt a problémát neked kell megoldanod. Neked kell tudnod, hogy az adott memóriaterületen milyen típusú adat van.
int *cim = &i;
Ha változót deklarálsz, és a név *-gal kezdődik, azzal jelzed, hogy az az adat egy memóriacím. Azt, hogy milyen típusú adat található azon a memóriacímen, azzal határoztad meg, hogy milyen típusú változót hoztál létre. Így a "cim" változó egy olyan memóriacím, ahol egy int típusú adat kezdődik. A gép onnan fogja tudni, hogy hány bájtot kell végigolvasnia, hogy tudja, mi a típusa, és az hány bájton fér el.
Mi van akkor, hogyha adva van a memóriacím, és te az azon a címen kezdődő értéket akarod kiolvasni? Ezt úgy teheted meg, hogy:
*cim
Vagyis, ha adva van egy memóriacím, elé egy *-ot odabiggyesztve kapod meg az értéket, már ha tudjuk, hogy milyen típusú adatot tartunk ott. De most tudjuk, mivel cim-et int-nek deklaráltuk.
int i = 5;
int *cim = &i;
int ertek = *cim;
Még egy dolgot kell tisztáznunk, hogy mi van akkor, ha tudjuk a memóriacímet, de azt nem tudjuk, hogy ott mi van. Ekkor csinálhatsz olyat, hogy:
void *cim = &i;
A void típus jelzi, hogy azon a címen ismeretlen típusú adat van, és mivel típus híján nem tudjuk, meddig kell olvasni a memóriát, az ilyen típusú memóriacímeket cast-olás nélkül vagy néhány spéci memóriakezelő függvény kivételével semmire sem tudjuk használni.
További kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!