Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Pokazivac promenljive ima dve razlicite adrese?

[es] :: C/C++ programiranje :: Pokazivac promenljive ima dve razlicite adrese?

[ Pregleda: 2775 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

_ikac
Ivan Raznatovic
Beograd

Član broj: 290105
Poruke: 54
*.dynamic.sbb.rs.



+1 Profil

icon Pokazivac promenljive ima dve razlicite adrese?18.06.2013. u 14:38 - pre 131 meseci
Imam par nejasnih stvari sto se tice pokazivaca, ne znam da li je to normalno ili nije. U sustini volim da eksperimentisem i naisao sam na sledece:

Jedna promenljiva ima dve razlicite adrese u ram memoriji? Da li je to uopste dobro ili nije ? Evo kako sam to ustanovio!

Primer 1:

Lociranje ram adrese date promenljive

Code:

    unsigned short int shortVar = 5;
    unsigned long int  longVar = 65535;
    
    std::cout<< "ShortVar RAM Address :"<< "\t" << &shortVar << "\n";  
    std::cout<< "LongVar RAM Address :" << "\t"  << &longVar  << "\n";


Posto sam locirao ram adresu promenljive gde je smestena i kao izlaz dobijam :
Citat:

ShortVarRAM Address : 0 xbfb4d39 e
LongVar RAM Address : 0 xbfb4d39 8


E sada problem nastaje kada hocu da sacuvam adresu u pokazivac:

Code:

    unsigned short int shortVar = 5;
    unsigned long int  longVar = 65535;
    unsigned short int *pointer= 0;    // divlji pokazivac (NULL)

    //Smestanje adrese u pokazivac
    pointer = &shortVar;

    std::cout<< "Pointer RAM Address    :" << "\t"  << &pointer << "\n";


Izlaz za pointer je :

Citat:

Pointer RAM Address : 0 xbfb4d39 0


Sada mene buni sledece, moje neko shvatanje ovoga je ako ja napravim pokazivac i dodam mu adresu neke promenljive on bi trebao da mi ukazuje na tu adresu koju sam zadao a ne neku drugu. Ja iskreno mislim da je on meni pokazao adresu pointera a ne adresu shotVar?
Jer ove dve promenljuve imaju dve razlicite adrese a koliko sam shvatio treba da imaju istu jer sam sa referencom preuzeo vrednost?

shortVar = 0 xbfb4d39 e
pointer = 0 xbfb4d39 0
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Pokazivac promenljive ima dve razlicite adrese?18.06.2013. u 14:55 - pre 131 meseci
Pokazivač takođe ima svoje mesto u memoriji. Sa &pointer dobijaš mesto tog pokazivača, a bez ampersanda, kad stoji samo pointer dobijaš adresu na koju pokazivač pokazuje.

Takođe, ne bih da te sad zbunjujem, ali vredi znati da ne moraju sve promenljive da stoje u memoriji. Kompajler može po svom nahođenju neku promenljivu da smesti u neki od internih registara mašine. Tako se dobija brže izvršavanje. Kompajler neće to uraditi za promenljivu za koju se u kodu traži adresa promenljive, ali hoće ako se ne traži. Tokom debagovanja optimizovanog koda je zato nekad nemoguće dobiti adresu neke promenljive, jer adresa i ne postoji. Adresa je registar.
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.dynamic.sbb.rs.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Pokazivac promenljive ima dve razlicite adrese?18.06.2013. u 14:58 - pre 131 meseci
Ovako ispisuješ ADRESU POINTERA, koji i jeste TREĆA promenljiva, otuda i treća vrednost:
std::cout<< "ShortVar RAM Address :"<< "\t" << &shortVar << "\n";

Ovako možeš (duži način) da ispišeš ADRESU ONOGA NA ŠTA POINTER POKAZUJE:
std::cout<< "Pointer RAM Address :" << "\t" << &(*pointer) << "\n";


Evo, Mihajlo je sve objasnio.
 
Odgovor na temu

_ikac
Ivan Raznatovic
Beograd

Član broj: 290105
Poruke: 54
*.dynamic.sbb.rs.



+1 Profil

icon Re: Pokazivac promenljive ima dve razlicite adrese?18.06.2013. u 15:10 - pre 131 meseci
Hmm malo mi je ovo sada konfuzno. Mihajlo da li kojim slucajem znas neki link gde bi mogao malo vise o tome da procitam. Koliko sam ja upucen sve se cita iz ram steka a sve se smesta free store polja...
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.cisco.com.



+395 Profil

icon Re: Pokazivac promenljive ima dve razlicite adrese?18.06.2013. u 15:19 - pre 131 meseci
Isprintao si int** (pointer na pointer) umesto int* regular pointer ..
Jer &(adresa) od int* je int** odnosno & (adresa) od int koji daje int*
Pogledaj ovde:
http://c-faq.com/~scs/cclass/int/sx8.html

Viva lollapalooza
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Pokazivac promenljive ima dve razlicite adrese?18.06.2013. u 15:24 - pre 131 meseci
Za sada je bolje da se time ne opterećuješ. Može da prođe deset godina programiranja u C/C++, a da ti ova informacija ne zatreba. Ali Marfi je čudo, pa možda već sutra uključiš neku tešku optimizaciju u kompajleru, i kreneš da debaguješ, a kad tamo promenljiva ima vrednost, ali nema adresu.
 
Odgovor na temu

glorius
Damir Nikolic
C++ developer
SR

Član broj: 4366
Poruke: 428
*.dynamic.isp.telekom.rs.

ICQ: 208550327


+14 Profil

icon Re: Pokazivac promenljive ima dve razlicite adrese?18.06.2013. u 15:53 - pre 131 meseci
Ovo za registar je vrlo interesantno.
Da li je moguce nekako reprodukovati to u debuggeru?
Malo sam razmisljao, po meni je logicnije da ako vec cuva u registru, da cuva samo pokazivac na promenljivu koja je u svakom slucaju u memoriji, ili gresim?
EOF
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Pokazivac promenljive ima dve razlicite adrese?18.06.2013. u 16:09 - pre 131 meseci
Ako se u kodu negde koristi pokazivač na promenljivu onda ta promenljiva ne može da stoji u registru. Kompajler zna šta može, a šta ne može. Mrzi me sad da pravim primere. Pokušao sam upravo da napravim jednu malu funkciju koja ništa ne radi sa jednom promenljivom koja ničemu ne služi, ali kompajler je ukinuo kompletnu funkciju jer nije radila ništa korisno. Dobar je kompajler.
 
Odgovor na temu

_ikac
Ivan Raznatovic
Beograd

Član broj: 290105
Poruke: 54
*.dynamic.sbb.rs.



+1 Profil

icon Re: Pokazivac promenljive ima dve razlicite adrese?18.06.2013. u 19:10 - pre 131 meseci
A jel postoji mogucnost da se testira da li je pokazivac u memoriji ili u registru?

Npr ako ja napravim novi pointer tipa kao sto je

Code:

int * pointer;
pointer = new (nothrow) int [5];
if (pointer == NULL) {
  // error assigning memory. Take measures.
  };

Ja mogu da testiram da je on zauzeo jedan deo (kockicu) za sebe u memoriji i da postoji!

Uostalom, za koji moj je ovo potrebno da se izvinem na izrazu? Posto mene u vecini slucajeva zanima TCP/IP jel menij kog vraga ovo potrebno? Verujem lepo je znati ali sto da lupam glavu ako kao sto kazes u jedno 10 godina ti jenom zatreba kao sto se takoce goto koristi svake 15 god.
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Pokazivac promenljive ima dve razlicite adrese?18.06.2013. u 23:44 - pre 131 meseci
Kako rekoh, to je za sad nebitan podatak. Zamisli da ga nisam ni spomenuo.
 
Odgovor na temu

[es] :: C/C++ programiranje :: Pokazivac promenljive ima dve razlicite adrese?

[ Pregleda: 2775 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.