Fonksiyon İşaretçilerini Tanımlama
Coddy'nin C Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 33 / 61.
Şu ana kadar, struct embedding kullanarak kalıtımı simüle etmeyi öğrendik. Ancak gerçek polimorfizm —farklı nesnelerin aynı çağrıya farklı şekilde yanıt verdiği durum— daha fazlasını gerektirir: function pointers.
Bir fonksiyon göstericisi (function pointer), bir fonksiyonun adresini saklayan bir değişkendir. Tıpkı normal bir göstericinin verinin adresini tutması gibi, bir fonksiyon göstericisi de yürütülebilir kodun adresini tutar.
Söz dizimi ilk başta korkutucu görünebilir. Bir fonksiyon işaretçisi (function pointer) bildirmek için, dönüş türünü, ardından parantez içinde bir yıldız işaretiyle birlikte işaretçi adını ve son olarak parametre türlerini belirtirsiniz:
int (*operation)(int, int);Bu, iki int parametresi alan ve bir int döndüren herhangi bir fonksiyona işaret edebilen operation adında bir değişken tanımlar. *operation etrafındaki parantezler kritiktir; onlar olmadan, bir işaretçi döndüren bir fonksiyon tanımlıyor olurdunuz.
Bu işaretçiye bir fonksiyon atamak için sadece fonksiyonun adını (parantez olmadan) kullanın:
int add(int a, int b) {
return a + b;
}
int (*operation)(int, int);
operation = add; // Şimdi operation, add fonksiyonunu işaret ediyorFonksiyon adı, adresi olarak görev yapar. Ayrıca açıkça &add kullanabilirsiniz, ancak bu isteğe bağlıdır — her iki form da C'de eşdeğerdir.
Görev
KolayFonksiyon işaretçilerini (function pointers) bildirme ve onlara fonksiyon atama alıştırması yapalım. Bir fonksiyon işaretçisinin farklı aritmetik fonksiyonları tutabildiği basit bir matematik işlem sistemi oluşturacaksınız.
Şunları yapan bir program yazın:
- İki fonksiyon tanımlar:
multiply— ikiintparametresi alır ve çarpımlarını döndürürsubtract— ikiintparametresi alır ve birinciden ikinciyi çıkararak sonucu döndürür
mainiçinde, ikiintparametresi alan ve birintdöndüren fonksiyonları işaret edebilenoperationadında bir fonksiyon işaretçisi değişkeni bildirir- Üç girdi okur: iki tam sayı ve bir işlem kodu (çarpma için 1, çıkarma için 2)
- İşlem koduna bağlı olarak, uygun fonksiyonu
operationişaretçinize atar - Atanan işlemin adını yazdırır, ardından fonksiyonu işaretçi aracılığıyla çağırmanın sonucunu yazdırır
Üç girdi alacaksınız: birinci sayı, ikinci sayı ve işlem kodu (1 veya 2).
Çıktınız şu şekilde görünmelidir:
Operation: multiply
Result: 35Burada multiply işlemin adıdır (veya kod 2 ise subtract) ve 35, fonksiyonu işaretçiniz aracılığıyla çağırmanın sonucudur (bu durumda 5 × 7).
Unutmayın: fonksiyon işaretçisini bildirmek için dönüş tipine, parantez içinde yıldız işaretiyle birlikte işaretçi adına ve parametre tiplerine ihtiyacınız vardır. Bir fonksiyon atamak için, parantez kullanmadan sadece fonksiyon adını kullanın.
Kopya kağıdı
Bir fonksiyon göstericisi (function pointer), bir fonksiyonun adresini saklayan ve aynı gösterici üzerinden farklı fonksiyonların çağrılmasına izin vererek polimorfizm sağlayan bir değişkendir.
Bir Fonksiyon Göstericisi Tanımlama
Sözdizimi; dönüş türünü, parantez içinde yıldız ile birlikte gösterici adını ve parametre türlerini belirtir:
int (*operation)(int, int);Bu, operation değişkenini, iki int parametresi alan ve bir int döndüren herhangi bir fonksiyona işaret eden bir gösterici olarak tanımlar. *operation etrafındaki parantezler zorunludur.
Bir Göstericiye Fonksiyon Atama
Fonksiyon adını parantez kullanmadan kullanın:
int add(int a, int b) {
return a + b;
}
int (*operation)(int, int);
operation = add; // operation artık add fonksiyonunu işaret ediyorFonksiyon adı, onun adresi gibi işlev görür. Ayrıca açıkça &add de kullanabilirsiniz, ancak bu isteğe bağlıdır.
Kendin dene
#include <stdio.h>
// TODO: Çarpma fonksiyonunu burada tanımlayın
// TODO: Çıkarma fonksiyonunu burada tanımlayın
int main() {
int num1, num2, code;
// Girdiyi oku
scanf("%d", &num1);
scanf("%d", &num2);
scanf("%d", &code);
// TODO: İki adet int parametre alan ve bir int döndüren fonksiyonları
// işaret edebilen 'operation' adında bir fonksiyon göstericisi tanımlayın
// TODO: İşlem koduna göre (çarpma için 1, çıkarma için 2),
// uygun fonksiyonu işlem göstericinize atayın
// TODO: İşlem adını ve sonucu yazdırın
// Format:
// Operation: <name>
// Result: <result>
return 0;
}Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Object Oriented Programming bölümündeki tüm dersler
1Modüler Programlama Temelleri
Başlık DosyalarıInclude Guard'larKaynak DosyalarıStatik FonksiyonlarÖzet: Modüler Hesap Makinesi4Kapsülleme
Opaque Pointer KavramıOpaque Struct TanımlamaGetter ve Setter MetotlarıSetter Metotlarında DoğrulamaÖzet: Gizli Kutu7Fonksiyon İşaretçileri
Fonksiyon İşaretçilerini TanımlamaFonksiyon İşaretçilerini ÇağırmaFonksiyon İşaretçileri için TypedefFonksiyonları Argüman Olarak GeçirmeÖzet: Hesap Makinesi Yönlendirme2Nesneler ve Metotlar
Nesne Olarak Struct'lar'Self' İşaretçisiConst Doğruluğuİşaretçi vs DeğerYardımcı MetotlarÖzet: Point Manager5Proje: Basit Banka Hesabı
Proje KurulumuHesabın Oluşturulması3Nesne Yaşam Döngüsü
Constructor DeseniDestructor DeseniStack İlklendirmeDerin KopyalamaÖzet: String Wrapper6Kompozisyon Yoluyla Kalıtım
Struct Gömmeİlk Üye KuralıÜst Üyelere ErişimUpcastingÖzet: Şekil Hiyerarşisi