C++: Kérdés a new operátor használatával?
Programozzunk C++ nyelven c. tankönyv
int *p = new int (12);
// Futás közben lefoglalásra kerül a memóriaterületről ( (1. kérdés) melyik memóriaterület? adatszegmens? ) sizeof(int) méretű terület és a p mutató az első bájtjára mutat továbbá a területen lévő érték 12 - (2. kérdés) Jól értem?
int *q = new(p) int(23);
// Mivel a new után zárójelben pointer van ezért nem történik memóriafoglalás, hanem a q mutató a p mutatóra mutat, és a p által mutatott területen lévő értéket átírjuk 12-ről 23-ra - (3. kérdés) Jól értem?
A mutatók eltérő típusúak is lehetnek:
long a = 0x19792003;
char *p = new( &a ) char;
(4. kérdés) - A &a címe művelet int típusú értéket ad vissza?
(5. kérdés) - Melyikre érti hogy eltérő? long <> int vagy long <> char?
(6. kérdés) - A new()-nél a zárójelbe változót kellene megadni és annak a memóriacímével tér vissza. De itt konkrét értéket adtunk meg. Ha értéket adounk meg akkor azt automatikusan memóriacímnek veszi?
(7. kérdés) Ez által a p mutató az "a" változó első bájtjára mutat és csak az érték első bájtját adja vissza hivatkozáskor?
A könyvemben ez van a new-ről:
new típus
new típus[kif]
new típus(kif_lista)
new (kif_lista) típus
new (kif_lista) típus (kif_lista)
Ha a fentieket tisztázzuk, akkor nem értem hogy ahova 1 értéket kellene írni miért kifejezés listát lehet. (8. kérdés) Ez esetben miben változik a memóriafoglalás?
Nagyon megköszönném ha segítenétek. Köszönöm, üdv
"1. kérdés) melyik memóriaterület?"
A pool-nak nevezett adatterületen. A lényeg, hogy nem a veremben.
"sizeof(int) méretű terület és a p mutató az első bájtjára mutat továbbá a területen lévő érték 12 - (2. kérdés) Jól értem?"
Igen, ez így korrekt.
"int *q = new(p) int(23);"
Ilyenkor a new nem maga dönti el, hol foglaljon memóriát, hanem megadjuk a konkrét helyet. Vagyis rádefiniáljuk a korábbi területre, és inicializáljuk 23-mal.
"(4. kérdés) - A &a címe művelet int típusú értéket ad vissza?"
Az 'a' jelen esetben egy long int változó. Ennek a címére fogja létrehozni a new a karakter változót. Vagyis a-val long intet kapunk vissza, *p-vel karaktert.
...
"(5. kérdés) - Melyikre érti hogy eltérő? long <> int vagy long <> char?"
long <> char
(Igazából itt nem volt int, hanem egy long int. A 'long' az 'long int'.)
"(6. kérdés) - A new()-nél a zárójelbe változót kellene megadni és annak a memóriacímével tér vissza. De itt konkrét értéket adtunk meg. Ha értéket adounk meg akkor azt automatikusan memóriacímnek veszi?"
Egy változó címét adtuk meg. Ha konkrét értéket adunk, akkor én úgy tudom, hogy olyankor lefoglalandó méretet jelent, és másként működik. De ennek utána kellene néznem, vagy talán valaki majd javít. :)
"(7. kérdés) Ez által a p mutató az "a" változó első bájtjára mutat és csak az érték első bájtját adja vissza hivatkozáskor?"
Így van, az első bájtot adja vissza char típusúként.
A *p-t nem érdekli, hogy került oda az adat, csak memória bájtokat lát. Mivel ő char típusra mutat, kivesz egy bájtot és char-ként kezeli.
"(6. kérdés)"
Rákerestem, mert így még nem használtam, de ha jól értem, akkor csinálhatjuk egyrészt így:
char *p = new( &a ) char;
ilyenkor egy címet adunk át, ahol a memóriahelyet le kell foglalnia, vagy így:
int *p = (int*) new(16);
vagy
void *p = new(16);
Ilyenkor nem adunk meg típust neki, ezért megadjuk, mennyi memóriát foglaljon le. Ez egy típus nélküli pointert ad vissza, amit vagy "cast-olni" kell a szükséges típusra, vagy a címet típus nélküli pointerbe tenni.
"(4. kérdés) - A &a címe művelet int típusú értéket ad vissza?"
Az 'a' jelen esetben egy long int változó. Ennek a címére fogja létrehozni a new a karakter változót. Vagyis a-val long intet kapunk vissza, *p-vel karaktert.
Ez nekem rendben is lenne, ha new(a) szerepelne, de itt new(&a) van. A konkrét kérdésem az az, hogy ha a new()-nek memóriacímet adunk át, akkor arra a területre foglal le területet?
---------------------------------------------------------
"(5. kérdés) - Melyikre érti hogy eltérő? long <> int vagy long <> char?"
long <> char
Ha jól értem, tegyük fel van egy int változóm ami így néz ki a memóriában:
0000 0010 1010 0011 0101 1010 1111 1001
Most ha a char* mutatóval rámutatok erre akkor az első bájtjára mutatok rá, igaz? Vagyis 0000 0010-et kapok, az már másodlagos hogy logikailag összefüggő számot szétszedtünk, balról-jobba nézve az első bájtra mutat a pointer? Vagy helyiértéknek megfelelően, vagyis jobbról-balra nézve az első?
---------------------------------------------------------
"Az utolsó résznél valószínűleg azért kif_lista, mert több paramétere is lehet a new-nak."
Tévednék azzal kapcsolatban hogy paraméterei függvényeknek van? Kifejezés lista szerepel itt. Csak a kérdésem az hogy ekkor miben működik másként, pl:
int a, b, c;
int *p = new int (a, b, c);
A könyv szerint ez így akkor megengedett, de mit csinál? a,b,c területekre definiál memóriát? De akkor honnan tudom melyik hol van, hiszen a,b,c nem feltétlenül egymás mellett helyezkedik el (most épp igen, de elképzelhető másik eset ahol nem).
---------------------------------------------------------
Nagyon-nagyon köszönöm a segítségedet, nagyon sokat segítettél. Üdv
"A konkrét kérdésem az az, hogy ha a new()-nek memóriacímet adunk át, akkor arra a területre foglal le területet?"
Igen. Pont azért, mert new(&a) van ott. Vagyis az 'a' változó címe.
"Vagy helyiértéknek megfelelően, vagyis jobbról-balra nézve az első?"
Azt adja vissza, ami a pointer által mutatott helyen van, vagyis a legkisebb című bájton lévő karaktert. (Hogy ez melyik bájt lesz, az attól függ, hogy az architektúra hogyan tárolja az int típusokat. Ld: "big endian", "little endian".) A *char pointert nem érdekli, hogy az egyetlen nagy szám, vagy csak bitek sorozata, vagy egy ascii szöveg. Ha char-ra mutat, akkor karakterekként látja, nem foglalkozik helyiértékekkel. :)
"Tévednék azzal kapcsolatban hogy paraméterei függvényeknek van?"
Lap teteje.
Aztán lehet, hogy én értem félre ezt a kif_lista dolgot, amit a szerző írt. :)
Köszönöm, már csak egyetlen kérdésem van.
new(érték) típus
Az "érték" nekem most a lefoglalandó méretet jelenti, vagy egy memóriacímet ahová tárolni kell? Ha méretet jelentene akkor mi értelme a new[] -nek?
Rosszul tudom hogy a címe művelet (&a) int típusú értéket ad vissza?
Köszönöm, üdv
"Rosszul tudom hogy a címe művelet (&a) int típusú értéket ad vissza?"
Nem int típust, hanem egy pointert. Ez egy memóriacímet jelent de nem int, hanem pointer típusú. A C/C++ élesen különválasztja a címeket más egész számoktól, külön típus van a címeknek (pointer) és kicsit másképp is kezeli őket. (Ld: pointer aritmetika.)
A new() dologba azért nem merek jobban belefolyni, mert én is csak most néztem utána, nem használtam és nem akarok butaságot mondani. De biztos lesz még itt valaki, aki kifejti. :)
Kapcsolódó 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!