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

Kullanıcı girişi yaparak ya da zorunlu olan * alanlarını doldurarak yorum yapabilirsiniz.

İsminiz *

Email adresiniz *

Web siteniz

Mesajınızı buraya yazabilirsiniz:

Toplam 2 yorum var.

  1. Gurcan Abi | 06 May 2009, 08:38

    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.

  2. Şadi Evren ŞEKER | 06 May 2009, 13:12

    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.

Bu Yazı Hakkında

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
Yapılan Son Yorumlar
Yakın Yazılar
Bağlantılar