• sadece prototipi* bilinen bir fonksiyonu, ismi bilinmese dahi, pointer yardimi ile cagirmayi saglayan mekanizma. device driver programlamaya kadar her turlu programlama isinin icinde olabilir, event driven uygulamarda da kullanilir (yoksa nasil bilsin isletim sistemi sen ne isim verdin fonksiyona).
  • class member functionlarda kullanımı şu şekilde:

    class myfirstfunctionpointertrialclass
    {
    public:
    void displayer()
    {
    std::cout<<"calisti"<<endl;
    }
    };

    typedef void (myfirstfunctionpointertrialclass::*fpointer)();

    int main(void)
    {
    myfirstfunctionpointertrialclass* hede=new myfirstfunctionpointertrialclass();
    fpointer fp=&myfirstfunctionpointertrialclass::displayer;
    (hede->*fp)();
    return 0;
    }

    gibi.
  • hani boyle (hani'nin cumleye kattigi ictenlik) saygi duydugumuz, gordugumuzde selam verdigimiz eyvalla dedigimiz, ve fakat cok da samimilesmek istemedigimiz, nedense cekindigimiz agir agabeyler olur ya, bildin mi? (bildin mi'nin getirdigi babacanlik) hah iste onlar gibidir function pointer benim icin. severim sayarim, selamini alir yeri gelir kullanirim. ama cok da abartmam, abartamam. yapamam bunu.

    oyle de bi benzetme yaptim yani. oldu bence.
  • sayesinde normalde nesne yönelimli olmayan c'de structlar ile birlikte sınıf benzeri yapılar oluşturabiliriz:

    #include <stdio.h>
    #include <math.h>

    typedef struct myclass {
    int x;
    int y;
    int (*orijinuzakliginihesapla)(struct myclass);
    } myclass;

    int orijinhesapla(myclass sinif) {
    return sqrt((sinif.x * sinif.x) + (sinif.y * sinif.y));
    }

    int main() {
    myclass sinif;
    sinif.x = 3;
    sinif.y = 4;
    sinif.orijinuzakliginihesapla = orijinhesapla; //&orijinhesapla da olabilir burası
    printf("%d\n",sinif.orijinuzakliginihesapla(sinif));
    return 0;
    }

    tabii derleme yaparken "-lm" eklemek gerekiyor. math headerini kullanmamışsak eklememize gerek yok tabii.
    şurada güzel bilgiler var nesne yönelimli c ile ilgili.
  • kendisi genel bağlamda aslında bir "fonksiyon işaretçisi" değildir.

    uygulama aşamasında kendisi bir void *cast'i olarak tasarlanır.
    yani burada tuttuğu "işaretçi"ye tuttuğu şeyin bir fonksiyon olduğunu tanımı yapan kişi anlatır yoksa bu düpedüz bildiğimiz bir void pointer'dır.

    c'de kullanımı çok geniştir.
    driver kodlarken driver üzerindeki tüm "handler" structlarını işaretlemek için genelde tek bir void* kullanılır.
    çünkü neredeyse tüm handlerların tuttuğu bilgiler ve struct yapıları çok yakınken her bir handler için bir sürü pointer yaratmak yerine kodu yazan firmalar genelde tek bir void * ile tüm fonksiyon ve structlara erişebilirler.

    yani fonksiyon işaretçisi, tam sayı işaretçisi, void işaretçisi diye kafada gruplandırmaya gerek yoktur.

    c'de ve c++'da tek bir işaretçi vardır temelde. bunun amacı bir adres tutmaktır o kadar.
    örneğin bir toplama fonksiyonunu ele alalım.

    int toplama(int a, int b){
    return a+b;
    }
    int main(){

    int x = 0;
    x=toplama(2,3);

    }
    fonksiyonu gördüğünüz üzere oldukça basit bir toplama işlemi yapmak üzere tasarlanmıştır.
    main kısmında "compiler" yani derleyici, kodu derlerken bu fonksiyona stack üzerinde bir adres lokasyonunun üzerine koyar. tıpkı her değişkende yaptığı gibi.

    bir integer diyelim ki 2 byte yer tutuyorsa. derleyici bu integer değerine
    0x00000000 ve 0x00000001 lokasyonlarını ayırır.
    aynı şekilde de fonksiyonun aldığı, tuttuğu ve döndürdüğü her değer derleyici tarafından hesaplanır ve fonksiyona bu kadar yer tahsis edilir.

    işaretçi ise sadece fonksiyonun bu "tahsis" edilen yerin en üstündeki lokasyonu aklında tutar.

    örneğin eğer toplama fonksiyonu "compile" edildiği zaman derleyici bu fonksiyona
    0x01234567 adresini verdiyse.

    int (*toplama_isareticisi)(int,int) = &toplama; ifadesinde.
    biz derleyiciye "toplama" fonksiyonunun iki integer değer alan ve bir integer değer döndüren fonksiyonun adresini "toplama_isaretcisi" tarafından tutulacağını söylüyoruz.
    aslında bu adresi normal bir pointer ile bile tutabiliriz.
    fakat buradaki amaç derleyeciye tuttuğumuz adresin nasıl bir adres olduğunu söylemek böylece çağırırken derleyici bizden bu kurallara uymamızı bekleyip ona göre davranabilir.
    mesela;

    int a = 100;
    void *p = &a;

    dediğimiz zamanda da direkt adresi tutabiliriz, fakat elimizde sadece adres olur.
    compiler bunu nasıl kullanacağını bilmez çünkü pointer salaktır. tuttuğu şey sadece adrestir. bu sebeple pointer'a neyi tuttuğunu anlatmak amacıyla;
    int *p = &a; demek zorundasınızdır.
hesabın var mı? giriş yap