• Bağış
  • 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.

    Benzer Yazılar:

    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 1547 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.


    Category: Automata (otomatlar, özdevinirler), Bilgisayar Kavramları, C/C++, Derleyiciler, Programlama Dilleri, algoritma analizi (teory of algorithms), veri yapıları
    2 responses to “fonksiyon göstericileri (function pointer)”
    1. Gurcan Abi says:

      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 says:

      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.

    Leave a Reply