Fonksiyon İşaretçilerini Çağırma
Coddy'nin C Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 34 / 61.
Artık bir fonksiyon işaretçisinin (function pointer) nasıl bildirileceğini ve ona nasıl bir fonksiyon atanacağını bildiğinize göre, bir sonraki adım fonksiyonu bu işaretçi aracılığıyla gerçekten çağırmaktır.
Sözdizimi oldukça basittir — fonksiyon işaretçisini tıpkı normal bir fonksiyonu çağırır gibi kullanırsınız:
int add(int a, int b) {
return a + b;
}
int main() {
int (*operation)(int, int) = add;
int result = operation(5, 3); // add(5, 3) çağrısını yapar
printf("%d\n", result); // Çıktı: 8
return 0;
}Sadece işaretçi adını ve ardından argümanları içeren parantezleri yazın. C, işaretçiyi otomatik olarak dereference eder ve işaret ettiği fonksiyonu yürütür.
Ayrıca (*operation)(5, 3) ile açık dereference (başvuru giderme) sözdizimini de kullanabilirsiniz, ancak bu isteğe bağlıdır ve daha az yaygındır. Her iki form da özdeş sonuçlar üretir.
İşaretçiyi farklı fonksiyonlara yeniden atadığınızda gerçek güç ortaya çıkar:
int subtract(int a, int b) {
return a - b;
}
operation = subtract;
result = operation(5, 3); // Şimdi subtract(5, 3) çağrılıyor
printf("%d\n", result); // Çıktı: 2Aynı operation değişkeni artık tamamen farklı bir mantığı yürütür. Çalışma zamanında davranışı değiştirme yeteneği, C'deki polimorfizmin temelidir.
Görev
Kolayİşaretçiler (pointers) aracılığıyla fonksiyon çağırma ve hangi fonksiyonun yürütüleceğini değiştirme pratiği yapalım. Çalışma zamanında toplama ve çıkarma işlemleri arasında geçiş yapabilen basit bir hesap makinesi oluşturacaksınız.
Şunları yapan bir program yazın:
- İki fonksiyon tanımlar:
add— ikiintparametresi alır ve toplamları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 edebilencalcadında bir fonksiyon işaretçisi tanımlar- Dört girdi okur: iki tam sayı ve iki işlem kodu
- Her işlem kodu için:
calcişaretçisine uygun fonksiyonu atayın (toplama için 1, çıkarma için 2)- İşaretçi aracılığıyla fonksiyonu iki sayı ile çağırın
- Sonucu yazdırın
Dört girdi alacaksınız: birinci sayı, ikinci sayı, birinci işlem kodu (1 veya 2) ve ikinci işlem kodu (1 veya 2).
Çıktınız, aynı iki sayı kullanılarak gerçekleştirilen her bir işlem için ayrı satırlarda iki sonuç göstermelidir:
15
5Bu örnekte, 10, 5, 1, 2 girdileriyle: ilk işlem (kod 1) 10 + 5 = 15 toplamasını yapar, ardından işaretçi yeniden atanır ve ikinci işlem (kod 2) 10 - 5 = 5 çıkarmasını yapar.
Bu, aynı işaretçi değişkeninin çağrılar arasında yeniden atanarak nasıl tamamen farklı mantıkları yürütebileceğini gösterir.
Kopya kağıdı
Bir fonksiyonu bir işaretçi (pointer) aracılığıyla çağırmak için, işaretçi adını ve ardından argümanları içeren parantezleri kullanın:
int add(int a, int b) {
return a + b;
}
int main() {
int (*operation)(int, int) = add;
int result = operation(5, 3); // add(5, 3) fonksiyonunu çağırır
printf("%d\n", result); // Çıktı: 8
return 0;
}Ayrıca açık dereference sözdizimini (*operation)(5, 3) de kullanabilirsiniz, ancak bu isteğe bağlıdır.
Fonksiyon işaretçileri, çalışma zamanında farklı fonksiyonları işaret edecek şekilde yeniden atanabilir:
int subtract(int a, int b) {
return a - b;
}
operation = subtract;
result = operation(5, 3); // Şimdi subtract(5, 3) fonksiyonunu çağırır
printf("%d\n", result); // Çıktı: 2Bu, aynı işaretçi değişkeninin çağrılar arasında yeniden atanarak farklı mantıkları yürütmesine olanak tanır.
Kendin dene
#include <stdio.h>
// TODO: Toplama fonksiyonunu burada tanımlayın
// TODO: Çıkarma fonksiyonunu burada tanımlayın
int main() {
// Girdileri oku
int num1, num2, op1, op2;
scanf("%d", &num1);
scanf("%d", &num2);
scanf("%d", &op1);
scanf("%d", &op2);
// TODO: İki adet int parametre alan ve bir int döndüren fonksiyonları
// işaret edebilen 'calc' adında bir fonksiyon göstericisi (function pointer) tanımlayın
// TODO: İlk işlem kodu (op1) için:
// - Uygun fonksiyonu calc'a atayın (toplama için 1, çıkarma için 2)
// - Fonksiyonu gösterici üzerinden çağırın ve sonucu yazdırın
// TODO: İkinci işlem kodu (op2) için:
// - calc'ı uygun fonksiyona yeniden atayın
// - Fonksiyonu gösterici üzerinden çağırın ve sonucu yazdırın
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