İşaretçinin gösterdiği adresi elde etmek

Başlatan Klein, 07 Şubat 2012, 19:23:18

Klein

@muittin
şöyle düşün:

Eğer pointerimizin kapladığı alan değişkenimizle aynı olsydı ne olurdu?

char b; // adresi 0xFFFF;
char *p;

p = &b;
bu işlemde b nin adresi p ye atılıyor.  eğer p'nin kapladığı alan char( 8 bit olsaydı) bu 16 bitlik adresi nasıl tutacaktı?

peki pointer hep adreslenecek alanın büyüklüğü kadar örn 32 bit ise. neden char, int ya da short diye tanımlıyoruz? ptr deyip geçelim.

char a[100];
int b[100];
ptr *p;

p = a; dedik. a'nın adresini p ye attık.  veya p = b dedik. buraya kadar sorun yok.  peki p++; dediğimizde ne olacak? p nin değeri ne kadar artırılacak?  int pointer ise 2 byta , char pointer ise 1 byte.  işte bu int , char , short gibi tanımlamalar da burada devreye giriyor.

bir de void pointerler var. bunlarda tip tanımı yok.
char a;
int b;
long c;

void *p;

p = &a;
p=&b;
p=&c;

gibi kullanılabilir. derleyici pointerin tipini eşleştiği veri tipine göre kendisi seçer. Ama bu tip bir kullanım hata yapmaya çok müsait olduğu için pek önerilmez. 


muhittin_kaplan

Alıntı Yapp = a; dedik. a'nın adresini p ye attık.  veya p = b dedik. buraya kadar sorun yok.  peki p++; dediğimizde ne olacak? p nin değeri ne kadar artırılacak?  int pointer ise 2 byta , char pointer ise 1 byte.  işte bu int , char , short gibi tanımlamalar da burada devreye giriyor.
evet bu güzel oldu.

z

Alıntı Yap
p = a; dedik. a'nın adresini p ye attık.  veya p = b dedik. buraya kadar sorun yok.  peki p++; dediğimizde ne olacak? p nin değeri ne kadar artırılacak?  int pointer ise 2 byta , char pointer ise 1 byte.  işte bu int , char , short gibi tanımlamalar da burada devreye giriyor.

Nedenlerden birisi bu fakat daha önemlisi şu;

Diyelimki ardışıl adreslerde 0x00, 0x01, 0x02, 0x03 verileri var ve pointer 0x00 değeri saklayan adresi gösteriyor.

Pointerin gösterdiği yerdeki veri

0x00, 0x1000, 0x03021000 den herhangi birisi olabilir.

Veri olarak bunlardan hangisinin okunacağı, pointerin tipi ile alakalı.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mufitsozen

Alıntı yapılan: bunalmis - 09 Şubat 2012, 15:52:30

Nedenlerden birisi bu fakat daha önemlisi şu;

Diyelimki ardışıl adreslerde 0x00, 0x01, 0x02, 0x03 verileri var ve pointer 0x00 değeri saklayan adresi gösteriyor.

Pointerin gösterdiği yerdeki veri

0x00, 0x1000, 0x03021000 den herhangi birisi olabilir.

Veri olarak bunlardan hangisinin okunacağı, pointerin tipi ile alakalı.
kucuk bir ek bilgi, bunun bir little-endian bir mimari icin olmasi (ornegin x86 icin), ARM mimarisinde ise little yada big endian olup olmadigi kontrol registerlarindan okunmasi lazim
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.