Merhabalar,
C/Cpp programlama dilinde pointer(işaretci) önemli bir yere sahiptir.
Aslında C'yi farklı kılan özelliklerden biri de pointer kavramı olduğu aşikar.
Bu durumda pointer kavramı oldukça geniş çerçevede kullanılır.Ancak bu makalede fonksiyonların pointer ile kullanımını göreceğiz.
Dolayısıyla fonksiyonun pointer ile çağrılması ve fonksiyonun başka bir fonksiyona parametre verilmesi işlenecektir.
Aşağıda,fonksiyonu gösteren bir pointer tanımına yer verilmiştir:
tip (*fonksiyon_adi)(arguman_tipleri)
Bu durumda genel tanım şu şekilde açıklanabilir:
tip = Gösterilecek fonksiyonun geri dönüş değerini temsil eder. Yani fonksiyon 'int' döndürüyorsa bu değer 'int' olarak tanımlanmalıdır.
fonksiyon_adi = Asıl fonksiyonu gösterecek değişken adı/ismi olarak tanımlanır. Ancak gösterilecek fonksiyon ile aynı isimde olması gerekmez.
Yani değişken ismi gibi esnek tanımlanabilir.(fonksiyon_adi başında '*'(pointer) işareti olduğuna dikkat ediniz.)
arguman_tipleri = Gösterilecek fonksiyonun aldığı parametre sayısı kadar parametre tipleri belirlenmelidir.
Yani gösterilecek 'fonksiyon(char c,int a)' şeklinde ise 'arguman_tipleri' '(char,int)' şeklinde olmalıdır.
Örnek 1:
//standart int türünde parametre alan fonksiyon tanımı:
void fonksiyon1(int x)
{
printf( "%d\n", x );
}
int main()
{
//fonksiyonu gösteren pointer oluşturuluyor:
void (*fonk)(int);
/*tanımlanan pointer'e fonksiyon1 atanıyor.Bu noktadan sonra 'fonk' artık 'fonksiyon1''i temsil edecektir.
Ancak istenildiği taktirde "fonkisyon1(deger)" şeklinde de kullanılabilir. Yani pointer gösterilen fonksiyon kendi ismiyle de çağrılabilir.
*/
fonk = fonksiyon1;
//fonksiyon1'e parametre gönderiliyor:
fonk(44);
//fonksiyon normal çağrılıyor:
fonksiyon1(100);
return 0;
}
Ayrıca pointer'e fonksiyon adresi atanarak kullanılabilir.
Örnek:
fonk = &fonksiyon1;
Örnek 2:
float topla(int a,int b)
{
return a + b;
}
float bol(int a,int b)
{
return a / b;
}
float carp(int a,int b)
{
return a * b;
}
float cikar(int a,int b)
{
return a - b;
}
int main()
{
int a = 20;
int b = 2;
float (*fonk)(int,int);
fonk = topla;
printf("%d,%d'nin toplami:%f\n",a,b,fonk(a,b));
fonk = bol;
printf("%d,%d'nin bolumu: %f\n",a,b,fonk(a,b));
fonk = carp;
printf("%d,%d'nin carpimi: %f\n",a,b,fonk(a,b));
fonk = cikar;
printf("%d,%d'nin cikarma: %f\n",a,b,fonk(a,b));
}
Yukarıda verilen örneğin "main" kısmını incelediğimizde bir kez tanımlanmış gösterici ile
tüm fonksiyonlar çağrılmıştır-erişilmiştir.
Dolayısıyla aynı dönüş değeri ve arguman tiplerine sahip birden fazla fonksiyonu tek pointer tanımı vasıtasıyla çağırmak-erişmek mümkündür.
Aksi durumda yeni pointer oluşturmak gereklidir.
Son örneğimiz ise oluşturulan pointer'in başka bir fonksiyona parametre geçmek ile alakalıdır.
Örnek:
//fonksiyon parametre gönderilecek fonksiyon işaretçisi 'typedef' olarak tanımlanmalıdır.
typedef float (*fonksiyon)(int a, int b);
float topla(int a,int b)
{
return a + b;
}
float bol(int a,int b)
{
return a / b;
}
float carp(int a,int b)
{
return a * b;
}
float cikar(int a,int b)
{
return a - b;
}
//tüm işlemlere aracılık yapacak fonksiyonumuz.Aynı zamanda 3. parametresi fonksiyon pointer parametre alır.
float islemler(int a,int b, fonksiyon fonk)
{
float sonuc = fonk(a,b);
return sonuc;
}
int main()
{
int a = 20;
int b = 2;
printf("%d,%d'nin toplami:%f\n",a,b,islemler(a,b,topla));
printf("%d,%d'nin bolumu: %f\n",a,b,islemler(a,b,bol));
printf("%d,%d'nin carpimi: %f\n",a,b,islemler(a,b,carp));
printf("%d,%d'nin cikarma: %f\n",a,b,islemler(a,b,cikar));
return 0;
}
Çıktı:
20,2'nin toplami:22.000000
20,2'nin bolumu: 10.000000
20,2'nin carpimi: 40.000000
20,2'nin cikarma: 18.000000
İyi çalışmalar.
Hiç yorum yok:
Yorum Gönder