fonksiyon göstericileri (function pointer)
yazan: Şadi Evren ŞEKER
fonksiyon göstericilerinin amacı, programlama dilinde bulunan fonksiyonları gösteren birer referans bilgisi tutmaktır. Bu sayede gösterilmekte olan fonksiyon için hafızada ayrılmış olan yere erişmek ve dolayısıyla örneğin fonksiyonun yerel değişkenlerine ulaşmak mümkündür. Aşağıda C dilinde yazılmış bir fonksiyon göstericisi kullanan kod örneği verilmiştir:
#include#include void func(int); main(){ void (*fp)(int); fp = func; (*fp)(1); fp(2); } void func(int arg){ printf("%d\n", arg); }
Yukarıdaki kodda “func” isminde bir fonksiyon tanımlanmıştır. Ayrıca void tipinde dönüş değerine sahip ve int tipinde parametre alan bir fonksiyoö göstericisi “fp” tanımlanmıştır. Dikkat edilirse “func” fonksiyonunun ve “fp” göstericisinin hem parametreleri hem de dönüş değerleri aynıdır. Bu durum bir göstericinin foknsiyonu göstermesi (refer etmesi ) için gereklidir. Bu gösterme işlemi atama satırı olan
fp=func;
satırı ile yapılmaktadır. artık bu satırdan sonra “fp” göstericisine verilen her değer “func” fonksiyonuna verilmiş gibi icra edilir. Yani yukarıdaki kod çalışıtırıldığında ekranda önce 1 sonra 2 görülmektedir.
Karıştırılmaması gereken bir nokta:
void (*fp)(int);
void *fp(int);
Yukarıdaki iki satır birbirinden farklıdır. İlk satır bir fonksiyon göstericisini, ikinci satır ise gösterici döndüren bir fonksiyonu tanımlarken kullanılmalıdır. Yani yukarıdaki iki satır aynı değildir.
Fonksiyon göstericileirinin fonksiyonlara parametre olarak verilmesi.
bir fonksiyon parametre olarak bir fonksiyon göstericisini alabilir. Aşağıda bunu yapan temsili kod verilmiştir:
#include#include int func(int); void PassPtr(int (*pt2Func)(int)) { int sonuc = (*pt2Func)(12); printf("%d",sonuc); } main(){ int (*fp)(int); fp = func; PassPtr(fp); } int func(int arg){ return ++arg; }
Yukarıdaki örnek kodda, func ismindeki fonksiyonu gösteren fp isminde bir fonksiyon göstericisi tanımlanmıştır. Bu gösterici PassPtr fonksiyonuna parametre olarak verilmiştir. Bu kod çalıştırıldığında ekranda 13 sayısı görlür çünkü, func fonksiyonunu gösteren fp göstericisi PassPtr fonksiyonunun içinden çağrılmış ve değer olarak 12 parametresi atanmıştır. Fonksiyon incelenirse parametre olarak aldığı sayıyı bir arttırdığı görülür. Bu durumda ekrandaki değer 13 olmaktadır.
Dikkat edilirse yukarıdaki kod ile, bir fonksiyona başka bir fonksiyon verilebilmektedir. Bu sayede genel amaçlı fonksiyonlar yazılarak ve bu fonksiyonlar parametre olarak geçirilerek programlamada avantaj elde edilebilmektedir.
Fonskiyon göstericilerinden dizi oluşturmak:
Fonksiyon göstericileri de birer gösterici olduğu için normal bir göstericiye yapılan herşey bu göstericilere de yapılabilir. Bunlardan birisi de bir dizi tanımlamaktır.
Aşağıdaki örnek kodu inceleyelim:
#include#include typedef int (*pt2Function)(int); int func(int arg){ return ++arg; } int main(){ pt2Function funcArr1[10] = {NULL}; int (*funcArr2[10])(int) = {NULL}; funcArr1[0] = funcArr2[1] = func; printf("%d\n", funcArr1[1](12)); }
Yukarıdaki örnek kodda, iki adet fonksiyon gösterici dizisi tanımlanmıştır. İlk dizi olan funcArr1 dizisi, typedef marifeti ile tanımlanmıştır ve bu tip tanımı daha önceden yapılmıştır. İkinci dizi olan funcArr2 dizisi ise daha önceden tanımlanmış herhangi bir tip kullanmaksızın tanımlanmıştır. Sonuçta ekranda 13 sayısını gördüğümüz bu yukarıdaki kodda fonksiyon göstericisi, bir dizinin elemanı olarak tutulmakta ve çağrılmaktadır.
« otomat yönelimli programlama (automata based programming) | flip flop (flipflop) »
Yorumlar
Giriş yaparak yorum yazabilirsiniz.
bilgisayar.kavramlari.com üzerinde şu anda okumakta olduğunuz 'fonksiyon göstericileri (function pointer)' isimli yazı 18 Dec 2007 tarihinde, saat: 09:51 'de Şadi Evren ŞEKER tarafından gönderilmiş, toplam 370 defa okunmuştur.
Benzer yazıları Automata (otomatlar), Bilgisayar Kavramları, C/C++, Derleyiciler, Programlama Dilleri, algoritma analizi (teory of algorithms), veri yapıları kategorilerinden okuyabilirsiniz. Yazar ile irtibat kurmak için email gönderebilirsiniz. Yazıya yorum yapabilir ya da yapılan yorumları RSS 2.0 ile takibe alabilirsiniz.
Eklenen Son Yazılar
- Devamsal Geçiş Tarzı (Continuation-passing style, CPS)
- Kuyruk Özyinelemesi (Tail Recursion, Birikimsel Tarz, Accumulation Style)
- Sıralama Algoritmaları (Sorting Algorithms)
- Seçerek Sıralama (Selection Sort)
- Hızlı Sıralama Algoritması (Quick Sort Algorithm)
- Birleştirme Sıralaması (Merge Sort)
- Yığınlama Sıralaması (Heap Sort)
- Yığın Ağacı (Heap)
- Dizi üzerinde ağaç kodlaması
- Nöbetçi (Sentinel)
Yapılan Son Yorumlar
- hercumartesi: 777/10 mod23 işleminde takıldığım...
- hercumartesi: 2P = R olarak gösterip s için (3xP^2 + a)...
- Şadi Evren ŞEKER: Toplama işlemi sonucunda mod işlemi...
- bazenvebazen: n q b b w derken n q p b w demek istedik?...
- Şadi Evren ŞEKER: Tümleyeni terimini şu şekilde...
Bağlantılar