Temel C Programlama -37- Fonksiyon İşaretçileri

Daha öncesinde sizlere diziler ve fonksiyon adlarının aslında birer adres verisi bulunduran bir işaretçi olduğunu söylemiştik. Yani adres operatörü ile (&) dizinin adını yazdığımız zaman bize dizinin adresini vermekteydi. Aynı işlemi fonksiyon adına uyguladığımızda ise fonksiyonun hafızadaki adresini almaktaydık. Bu konu hakkında yaptığımız uygulamada hep beraber bunu görmüştük.

İşaretçiler hakkında son konumuz ise bu sebepten dolayı fonksiyon işaretçileri olmaktadır. Fonksiyon işaretçisi fonksiyonun hafızadaki adresini bize vermektedir. Aynı dizilerde olduğu gibi fonksiyonun başlangıç adresini &fonksiyonadi şeklinde bir operatör kullanımı ile alabilme imkanımız vardır.

Neden normal fonksiyon çağırma işlemi yerine fonksiyon işaretçilerini kullanmamız gerektiğini sorabilirsiniz. Normalde biz fonksiyonu çağırırken fonksiyonadi(); şeklinde biz söz dizimi kullanarak kolaylıkla işi halletmekteyiz. Bunun sebebi bazı durumlarda fonksiyon işaretçilerinin bize büyük bir esneklik sağlamasıdır. Örneğin bir diziyi sıralama algoritmasında sıralamanın artan veya azalan olacağını fonksiyon işaretçileri ile yapabiliriz.

Fonksiyon işaretçilerinin söz dizimi şu şekildedir.

void (*pf) (int);

Buradan bakıldığında biraz kafa karıştırıcı gibi görülebilir. Alışıldık C sözdiziminden uzakta görünen bir yapı ile karşı karşıyayız. Burada öncelikle *pf tanımlamasından başlayarak içten dışa doğru inceleyelim. *pf bir fonksiyonu işaret eden işaretçidir, void fonksiyonun döndürdüğü değer tipi ve int ise fonksiyonun argüman tipidir.

Şimdi fonksiyon işaretçisine işaretçileri ekleyelim ve tekrar okuyalım.

char* (*pf) (int*);

Burada pf yine fonksiyon işaretçisidir, char fonksiyonun döndürdüğü değer tipi, int* ise argüman tipidir. Şimdi fonksiyon işaretçilerinin kullanıldığı örnek bir kod yazıp kullanımına bakalım.

#include <stdio.h>
void fonksiyonumuz(int deger)
{
    printf("Fonksiyon Cagirildi Arguman: %d\n", deger);
}

main()
{
    void (*pf)(int);
    pf = &fonksiyonumuz;
    printf("Simdi Fonksiyonu Cagiriyoruz. \n");
    (pf)(5);
    printf("Fonksiyondan donuldu");
}

Burada görüldüğü gibi bir fonksiyon işaretçisi tanımladıktan sonra ilginç bir şekilde (pf) (5); şeklinde fonksiyon çağırıyoruz! C dilinde size en tuhaf görünen biçimlerden biri olacağı garantisini verebilirim. Bu sayede işaretçiler vasıtasıyla çağırdığımız fonksiyon argüman olarak 5 değerini almakta ve ekrana yazdırmakta. Programın ekran çıktısı şu şekilde olacaktır.

Aşağıda verdiğim kaynaklarda fonksiyon işaretçileri ile alakalı örnekler yer almaktadır. Konunun devamını merak ederseniz aşağıdaki örneklere göz atabilirsiniz.

Kaynaklar,

https://www.learn-c.org/en/Function_Pointers

https://www.geeksforgeeks.org/function-pointer-in-c/

Deitel, C How To Program 7th. ed, 2012, sf 338 vd.

Last updated