08.11.2014 Views

c_kitap

c_kitap

c_kitap

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

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

Yukarıdaki programda tanımlanan func isimli işlevin parametre değişkeni yok. func<br />

işlevinin geri dönüş değeri, -geri dönüş değeri ve parametre değişkeni olmayan- bir işlev<br />

adresidir. Yani func işlevi, kendisini çağıran kod parçasına böyle bir işlevin adresini<br />

iletiyor. func işlevi içinde tanımlanan yerel fp gösterici değişkeni, foo isimli işlevi<br />

gösteriyor. main işlevi içinde yer alan<br />

func()();<br />

deyiminde önce func işlevi çağrılır. Bu çağrıdan elde edilen geri dönüş değeri, foo işlevinin<br />

adresi olur. İkinci işlev çağrı işleci de foo işlevin çağrılmasını sağlar.<br />

İşlevler İçin Yapılan typedef Bildirimleri<br />

Bir işlev türü için typedef bildirimi yapılabilir:<br />

typedef double FuncDouble(int);<br />

Yukarıdaki bildirimden sonra FuncDouble, geri dönüş değeri double türden olan, tek<br />

parametresi int türden olan bir işlev türüdür.<br />

FuncDouble *fptr, *fpa[10];<br />

Yukarıdaki tanımlama ile fptr, geri dönüş değeri double ve parametresi int türden olan bir<br />

işlevi gösteren gösterici değişkendir. fpa ise fptr gibi göstericilerin oluşturduğu 10<br />

elemanlı bir dizidir. fpa dizisinin herbir elemanı bir işlev göstericisidir.<br />

Elemanları FuncDouble türden olan bir değişken tanımlanamaz. C<br />

FuncDouble func; /* Geçersiz */<br />

Ancak bu türden bir işlevin bildiriminde bir sorun yoktur:<br />

extern FuncDouble func;<br />

Yukarıdaki deyimle, geri dönüş değeri double türden olan, parametre değişkeni int<br />

türden olan bir işlev bildiriliyor.<br />

Uygulamalarda daha çok bir işlev adresi türü için typedef bildirimi yapılır:<br />

typedef int (*CmpFunc)(const void *, const void *);<br />

Yukarıdaki bildirimden sonra CmpFunc, geri dönüş değeri int türden olan, iki parametresi<br />

de const void * türünden olan bir işlev adresi türüdür:<br />

CmpFunc fcmp1, fcmp2, fcmpa[10];<br />

Yukarıdaki tanımlama ile fcmp1 ve fcmp2, geri dönüş değeri int türden olan, iki<br />

parametresi de const void * türünden olan bir işlevi gösterecek değişkenlerdir. fcmp1 ve<br />

fcmp2 işlev göstericisi değişkenlerdir. fcmpa ise, her bir elemanı fcmp değişkeninin<br />

türünden olan, 10 elemanlı bir dizidir.<br />

Bir işlev adresi türünün, bir işlevin parametre değişkeninin türü ya da işlevin geri dönüş<br />

değerinin türü olması bildirimleri oldukça karışık hale getirir. Okuma ve yazma kolaylığı<br />

açısından işlev adreslerine ilişkin türlere typedef bildirimleriyle yeni isimler verilir.<br />

Aşağıdaki örneği inceleyin:<br />

517

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

Saved successfully!

Ooh no, something went wrong!