2011-07-22 38 views
7

Özür dilerim, işaretçiler, diziler vb. Hakkında bir milyon soru olduğunu biliyorum, ancak temel olarak, bir şeye (ha ha!) Işaret eden hiçbir şey bulamıyorum. aslındaBir işaretçinin adresini bulma

char *mMem=new char[5000]; 
cout<<mMem[5]<<endl; 

hangisi: Ben belleğe bir yığın işaret etmek başlatıldığını bir işaretçi var

, ben bir dizi nasıl benzer bu belleğe erişebilir anlıyoruz

bir dizi değil o eleman mMem göz önüne alındığında oldukça doğru kelime değil farkındayım - -
char *mMem=new char[5000]; 
cout<<*(mMem+5)<<endl; 

ne olsa anlamıyorum bir eleman adresini almak için nasıl benim anlayış ise işte Doğru, çok emin olamaz çünkü Her site, işaretçiler ve diziler söz konusu olduğunda istediği kelimeleri kullanır gibi görünüyor. Yani, eğer ben:

char *mMem=new char[5000]; 
cout<<mMem[5]<<endl; 
    or 
cout<<*(mMem+5)<<endl; 

neden operatörün adresi doğru çalışmıyor:

cout<<&mMem[5]<<endl; 

yerine 5 elementin adresini alma, ben hafıza bloğu içeriğinin dışında bir baskı almak Bu öğeden itibaren. Öyleyse neden operatörün beklediğim gibi çalışmadığı ve hafızanın bir elemanının adresini nasıl alabildiğim?

cevap

14

&mMem[5] 5 elementin adresidir. Oradan belleğin çıktısını almanın nedeni, &mMem[5] türünün char* olduğu, ancak eski C'deki dizelerin de char* olduğundan, << işlecinin yalnızca oradan bir dize yazdırmak istediğinizi düşünmesidir. Ben yazdırmadan önce bir void* işaretçiyi döküm denemek:

arada
cout << static_cast<void*>(&mMem[5]) << endl; 

, &mMem[5] ve mMem+5 sadece aynıdır.

4

Öğe 5'in adresini beklediğiniz gibi alıyorsunuz, ancak char * için cout yazdırma işlevselliği, dize içeriğini işaretçi değerinden değil, o bellek konumuna yazdırmaktır.

İşaretçiyi bir int: cout << (int)&mMem[5];'a gönderin ve adresi yazdırılmış olarak almalısınız.

İlgili konular