[ _ikac @ 18.06.2013. 14:38 ] @
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
[ Mihajlo Cvetanović @ 18.06.2013. 14:55 ] @
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.
[ X Files @ 18.06.2013. 14:58 ] @
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.
[ _ikac @ 18.06.2013. 15:10 ] @
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...
[ deerbeer @ 18.06.2013. 15:19 ] @
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
[ Mihajlo Cvetanović @ 18.06.2013. 15:24 ] @
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.
[ glorius @ 18.06.2013. 15:53 ] @
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?
[ Mihajlo Cvetanović @ 18.06.2013. 16:09 ] @
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.
[ _ikac @ 18.06.2013. 19:10 ] @
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.
[ Mihajlo Cvetanović @ 18.06.2013. 23:44 ] @
Kako rekoh, to je za sad nebitan podatak. Zamisli da ga nisam ni spomenuo.