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

void Türden Göstericiler<br />

Bazı işlevler bellek blokları üzerinde genelleştirilmiş işlemler yapar. Bu işlevler işlem<br />

yaptıkları bellek bloklarında ne olduğuyla ilgilenmez. Bir bellek bloğunun içeriğinin<br />

bellekte başka bir yere kopyalandığını düşünün. İşlev kaynak adresten hedef adrese byte<br />

byte kopyalama yaparak bu amacı gerçekleştirebilir. Böyle bir işlevin parametre<br />

değişkenleri hangi türden olmalıdır?<br />

void göstericiler herhangi bir türden olmayan göstericilerdir. Bu türden değişkenlerin<br />

tanımlarında void anahtar sözcüğü kullanılır:<br />

void *ptr;<br />

void göstericilerin tür bilgisi yoktur. void göstericilerde adreslerin yalnızca sayısal<br />

bileşenleri saklanır. Bu yüzden void göstericilerle diğer türden göstericiler (adresler)<br />

arasında yapılan atamalar geçerlidir. void türden bir göstericiye herhangi bir türden bir<br />

adres sorunsuzca atanabilir. Belirli türden bir gösterici değişkene void türden bir adres de<br />

aynı şekilde sorunsuzca atanabilir.<br />

char *ptr;<br />

void *vp;<br />

/***/<br />

ptr = vp;<br />

/* Geçerli*/<br />

vp = ptr; /* Geçerli */<br />

void göstericiler belirli bir türe ait olmadıkları için, tür bilgisine sahip olan göstericiler<br />

üzerinde uygulanan bazı işlemler void türden göstericilere uygulanamaz:<br />

i) void türden göstericilerin * ya da [ ] işleçlerinin terimi olması geçersizdir. Bu işleçler bir<br />

nesneye erişmek için tür bilgisine gereksinim duyar.<br />

void func()<br />

{<br />

double a[50];<br />

void *vptr;<br />

}<br />

vptr = a; /* Geçerli */<br />

*vptr = 3.7; /* Geçersiz! */<br />

vptr[2] = 5.6; /* Geçersiz! */<br />

/****/<br />

Yukarıdaki kod parçasında *vptr ve vptr[2] ifadeleri geçersizdir.<br />

ii) void türden bir adres ile bir tamsayının toplanması ya da void türden bir adresten bir<br />

tamsayının çıkartılması geçersizdir. Çünkü gösterici aritmetiğine göre bir göstericinin<br />

değeri n kadar artırıldığında, gösterici içindeki adresin sayısal bileşeni n ile göstericinin<br />

gösterdiği nesnenin tür uzunluğunun çarpımı kadar artar. void göstericilerin türleri<br />

olmadığı için bu durumda sayısal bileşenin ne kadar artacağı da bilinemez.<br />

void türden göstericiler ++ ve -- işleçlerinin terimi olamaz.<br />

++ptr;<br />

ifadesi<br />

ptr = ptr + 1;<br />

ifadesine eşdeğerdir.<br />

283

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

Saved successfully!

Ooh no, something went wrong!