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 />

Adreslerle İşlemler - Adreslerin Artırılması ve Eksiltilmesi<br />

(Gösterici Aritmetiği)<br />

C dilinde bir adres bilgisi bir tamsayı ile toplanabilir, bir adres bilgisinden bir tamsayı<br />

çıkartılabilir. Böyle bir ifade toplanan ya da çıkartılan adres türündendir. Örneğin int<br />

türden bir nesnenin adresi ile 1 tamsayısı toplanırsa yine int türden bir nesnenin adresi<br />

bilgisi elde edilir.<br />

Bir adres bilgisine 1 toplandığında, adresin sayısal bileşeni adrese sahip nesnenin<br />

türünün uzunluğu kadar artar. Bu durumda örneğin DOS işletim sisteminde char türden<br />

bir göstericinin değeri, 1 artırıldığında adresin sayısal bileşeni 1, int türden bir gösterici 1<br />

artırıldığında ise adresin sayısal bileşeni 2 artar, double türden bir gösterici 1<br />

artırıldığında ise adresin sayısal bileşeni 8 artar.<br />

Bir gösterici değişkenin bellekte bir nesneyi gösterdiğini düşünelim. Bu gösterici<br />

değişkenin değeri 1 artırılırsa bu kez gösterici değişkeni, gösterdiği nesneden bir sonraki<br />

nesneyi gösterir duruma gelir.<br />

#include <br />

int main()<br />

{<br />

int k;<br />

int a[10];<br />

for (k = 0; k < 10; ++k) {<br />

*(a + k) = k;<br />

printf("%d ", a[k]);<br />

}<br />

}<br />

return 0;<br />

Yukarıdaki örnekte main işlevi içinde tanımlanan a dizisinin elemanlarına gösterici<br />

aritmetiği kullanılarak ulaşılıyor.<br />

*(a + k)<br />

a adresinden k uzaklıktaki nesne anlamına gelir. Bu da dizinin k indisli elemanıdır, değil<br />

mi? Dizi int türden değil de double türden olsaydı dizinin elemanlarına yine böyle<br />

ulaşılabilirdi, değil mi?<br />

Gösterici aritmetiği türden bağımsız bir soyutlama sağlar.<br />

İki adres bilgisinin toplanması geçersizdir. Ancak aynı dizi üzerindeki iki adres bilgisi<br />

birbirinden çıkartılabilir. İki adres birbirinden çıkartılırsa sonuç bir tamsayı türündendir.<br />

İki adres birbirinden çıkartıldığında önce adreslerin sayısal bileşenleri çıkartılır, sonra elde<br />

edilen değer adresin ait olduğu türün uzunluğuna bölünür. Örneğin a int bir dizi olmak<br />

üzere türden bir adres olmak üzere:<br />

&a[2] - &a[0] ifadesinden elde edilen değer 2 dir.<br />

Aşağıdaki programda gösterici aritmetiği sorgulanıyor. Programı derleyerek çalıştırın ve<br />

ekran çıktısını inceleyerek yorumlamaya çalışın:<br />

#include <br />

int main()<br />

{<br />

char s[10];<br />

int a[10];<br />

double d[10];<br />

243

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

Saved successfully!

Ooh no, something went wrong!