Kezdőoldal » Számítástechnika » Programozás » C++: Kérdés a new operátor...

C++: Kérdés a new operátor használatával?

Figyelt kérdés

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


2013. júl. 4. 15:03
 1/10 A kérdező kommentje:
használatáról** (cím)
2013. júl. 4. 15:03
 2/10 A kérdező kommentje:
hogy ahova egy KIFEJEZÉST** kéne írni
2013. júl. 4. 15:05
 3/10 anonim ***** válasza:

"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.


...

2013. júl. 4. 15:18
Hasznos számodra ez a válasz?
 4/10 anonim ***** válasza:

"(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.

2013. júl. 4. 15:26
Hasznos számodra ez a válasz?
 5/10 anonim ***** válasza:
Az utolsó résznél valószínűleg azért kif_lista, mert több paramétere is lehet a new-nak.
2013. júl. 4. 15:31
Hasznos számodra ez a válasz?
 6/10 anonim ***** válasza:

"(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.

2013. júl. 4. 16:10
Hasznos számodra ez a válasz?
 7/10 A kérdező kommentje:

"(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

2013. júl. 4. 16:31
 8/10 anonim ***** válasza:

"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?"

[link]

Lap teteje.

Aztán lehet, hogy én értem félre ezt a kif_lista dolgot, amit a szerző írt. :)

2013. júl. 4. 16:53
Hasznos számodra ez a válasz?
 9/10 A kérdező kommentje:

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

2013. júl. 4. 17:09
 10/10 anonim ***** válasza:

"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. :)

2013. júl. 4. 17:37
Hasznos számodra ez a válasz?

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!