08.11.2014 Views

c_kitap

c_kitap

c_kitap

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

C ve Sistem Programcıları Derneği - C Ders Notları - Necati Ergin<br />

"non-portable pointer conversion"<br />

Peki bir göstericiye adres bilgisi olmayan bir değer atanırsa ne olur? C'de bu doğrudan bir<br />

sözdizim hatası değildir. Yine otomatik tür dönüşümü söz konusudur. Atama işlecinin sağ<br />

tarafındaki ifadenin türü, atama işlecinin sol tarafında bulunan nesne gösteren ifadenin<br />

türüne çevrilerek atama yapılır. Dolayısıyla, atanan değer gösterici değişkenin türünden<br />

bir adrese çevrilerek göstericiye atanır. Örneğin:<br />

void func()<br />

{<br />

int x = 1356;<br />

int *ptr;<br />

ptr = x;<br />

/***/<br />

}<br />

Yukarıdaki örnekte<br />

ptr = x;<br />

atama deyimi ile ptr değişkenine x nesnesinin adresi değil, değeri atanıyor. x<br />

değişkeninin değeri olan 1356, atama öncesi tür dönüşümüyle bir adres bilgisine<br />

dönüştürülerek ptr değişkenine atanır. Artık ptr, x değişkenini göstermez, 1356<br />

adresindeki nesneyi gösterir:<br />

*ptr nesnesine erişmek artık bir gösterici hatasıdır.<br />

Nesnelerin Bellekteki Yerleşimleri<br />

Bir byte'tan daha büyük olan değişkenlerin belleğe yerleşim biçimi kullanılan<br />

mikroişlemciye göre değişebilir. Bu nedenle değişkenlerin bellekteki görünümleri<br />

taşınabilir bir bilgi değildir. Mikroişlemciler iki tür yerleşim biçimi kullanabilir:<br />

i)Düşük anlamlı byte değerleri belleğin düşük sayılı adresinde bulunacak biçimde. Böyle<br />

yerleşim biçimine little endian denir. Intel işlemcileri bu yerleşim biçimini kullanır. Bu<br />

işlemcilerin kullanıldığı sistemlerde örneğin<br />

int x = 0x1234;<br />

biçimindeki bir x değişkeni bellekte 1A00 adresinden başlayarak yerleştirilmiş olsun:<br />

Şekilden de görüldüğü gibi x değişkeninin düşük anlamlı byte değeri (34H) düşük sayısal<br />

adreste (1A00H) olacak biçimde yerleştirilmiştir.<br />

ii) İkinci bir yerleşim biçimi, düşük anlamlı byte'ın yüksek sayısal adrese<br />

yerleştirilmesidir.<br />

Böyle yerleşim biçimine big endian denir. Motorola işlemcileri bu yerleşim biçimini<br />

kullanır. Bu işlemcilerin kullanıldığı sistemlerde örneğin<br />

int x = 0x1234;<br />

biçimindeki bir x değişkeni bellekte 1A00 adresinden başlayarak yerleştirilmiş olsun:<br />

262

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!