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
Bilgisayar Kavramları ü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 1127 defa okunmuştur.
Benzer yazıları Automata (otomatlar, özdevinirler), 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.
Yazarın Kitabı
Bu yazının yazarı Şadi Evren ŞEKER'in son çıkan kitabı "Programlama ve Veri Yapılarına giriş (C, C++ ve JAVA ile)" hakkında bilgi almak için Buraya tıklayabilirsiniz.
Eklenen Son Yazılar
- Visual Basic ile Gösterici (Pointer) Kullanımı
- Hasse Çizgeleri (Hasse Diagrams)
- Zeki Vekiller (Akıllı Ajanlar, Intelligent Agents, Zeki Etmenler )
- Integral Kriptoanalizi ( Toplam Tecessüsü , Integral Cryptoanalysis)
- Diferansiyel Kriptoanalizi ( Fark Tecessüsü , Differential Cryptoanalysis)
- Sierpinski Üçgeni (Sierpinski Triangle)
- C ile programlamaya giriş final sınavı çözümleri
- Çok Seviyeli Sıralar (Multi Level Queues)
- Çift Özetleme (Double Hashing)
- İkinci Dereceden Sondalama (Quadratic Probing)
Yapılan Son Yorumlar
- Şadi Evren ŞEKER: Sıralama işleminiz poligonu...
- Şadi Evren ŞEKER: bahsettiğiniz sıralama algoritması...
- Abdurrahman ulusoy: merhaba hocam. gelişigüzel...
- Oguz Okutan: Merhaba hocam.. Fonksiyonlarda degere göre...
- Şadi Evren ŞEKER: Null, NULL, nil veya null olarak...
- Fatih Kabakci: hocam merhabalar,...
- kara: Çok güzel anlatılmış gerçekten teşekkürler...
- Şadi Evren ŞEKER: Bahsettiğiniz şekil dönüşümü...
- Caner: Kullanıcıdan açı girdisi almıyorsanız...
- Furkan Yediyildiz: Algoritmanin mantigi cok güzel...
- havva: çok sağolun çok güzel açıklamalar var tşk...
- Şadi Evren ŞEKER: typedef komutu, bir yapıdan yeni bir...
- fatih kabakci: hocam ben structures ile ilgili bir sorum...
- Şadi Evren ŞEKER: evet, yukarıda açıklanan, herhangi...
- Abdurrahman ulusoy: fi açısından teta kadar döndürme...
- Şadi Evren ŞEKER: Hayır yok, bir noktanın, herhangi...
- Abdurrahman ulusoy: Bu durumda yukarıdaki formüllerin...
- Abdurrahman ulusoy: Merhaba hocam Üstteki mesajımda...
- mustafa ekmekcioğlu: merhaba şadi bey ben hacettepe...
- Şadi Evren ŞEKER: Talebiniz üzerine...
Yakın Yazılar
Veri yapıları üzerinde fonksiyonlar
referans ile çağırma (call by reference)
Filitreleme Tipi Fonksiyonlar (Filter Type Functions)
fonksiyon göstericileri (function pointer)
Atıf ile Çağırma (Call by Reference)
Bindirme Tipi Fonksiyonlar (Mapping Style Functions)
Özyineli sayılabilir küme (Recursively Enumerable Sets)
OpenGL ile kullanıcılı iletişimi (user interaction)
Hesaplanabilir Fonksiyon (Computable Function)
Doğrusal Fonksiyon (Linear Function)
Pointer (Gösterici) ve Diziler (Arrays)
Linked List (Linkli Liste veya Bağlı Liste)
Özyineli Sayılabilir Diller (Recursively Enumerable Languages)
Biriktirme Tipi Fonksiyonlar ( Accumulator Type Functions)
Bağlantılar
int main(){
pt2Function funcArr1[10] = {NULL};
int (*funcArr2[10])(int) = {NULL};
funcArr1[0] = funcArr2[1] = func;
printf(”%d\n”, funcArr1[1](12)); //printf(”%d\n”, funcArr1[0](12));
}
şeklinde olması gerekmiyor mu? yanlış anlamayın niyetim sadece yazım hatasını düzeltmek.
Fonksiyon göstericiler hep karışık geliyor bana, biraz daha çalışmam gerek. yazı için teşekkürler.
Sizin yazdığınız kod doğru. Yazıda geçen kod da doğru. Kodda örnek olması için iki tane dizi elemanı fonksiyonu (func) göstermek için atanmış.
Yazıdaki kodda 0. eleman, sizin kodunuzda ise 1. eleman çağrılmış ve bu iki fonksiyon göstericisi de aslında aynı fonksiyonu gösteriyor.
Dolayısıyla iki kod da aynı işi yapar.