Fonksiyon İşaretçilerini Çağırma
Coddy'nin C Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 34 / 61.
Artık bir işlev işaretçisinin nasıl bildirileceğini ve ona bir işlev atanacağını bildiğinize göre, sonraki adım işlevi bu işaretçi aracılığıyla gerçekten çağırmaktır.
Söz dizimi basittir. İşlev işaretçisini, normal bir işlevi ç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ır
printf("%d\n", result); // Çıktı: 8
return 0;
}Argümanları içeren parantezlerin ardından yalnızca işaretçi adını yazın. C, işaretçinin başvurduğu işlevin başvurusunu otomatik olarak kaldırır ve bu işlevi çalıştırır.
(*operation)(5, 3) ile açık dereference sözdizimini de kullanabilirsin, ancak bu isteğe bağlıdır ve daha az yaygındır. Her iki biçim de aynı sonuçları üretir.
Asıl güç, işaretçiyi farklı işlevlere yeniden atadığınızda ortaya çıkar:
int subtract(int a, int b) {
return a - b;
}
operation = subtract;
result = operation(5, 3); // Şimdi subtract(5, 3) çağırır
printf("%d\n", result); // Çıktı: 2Aynı operation değişkeni artık tamamen farklı bir mantık yürütüyor. Çalışma zamanında davranışı değiştirebilme yeteneği, C dilindeki çok biçimliliğin temelidir.
Görev
Kolayİşaretçiler aracılığıyla işlev çağırma ve hangi işlevin çalıştırılacağını değiştirme alıştırması yapalım. Çalışma zamanında toplama ve çıkarma arasında geçiş yapabilen basit bir hesap makinesi oluşturacaksın.
Şunları yapan bir program yaz:
- İki işlev tanımlar:
add: ikiintparametresi alır ve toplamlarını döndürürsubtract: ikiintparametresi alır ve birinciden ikincisini çıkarır
mainiçinde, ikiintparametresi alan ve birintdöndüren işlevleri gösterebilencalcadlı bir işlev işaretçisi tanımlar- Dört girdi okur: iki tam sayı ve iki işlem kodu
- Her işlem kodu için:
- Uygun işlevi
calcdeğişkenine atar (toplama için 1, çıkarma için 2) - İki sayıyla işaretçi aracılığıyla işlevi çağırır
- Sonucu yazdırır
- Uygun işlevi
Dört girdi alacaksın: birinci sayı, ikinci sayı, birinci işlem kodu (1 veya 2) ve ikinci işlem kodu (1 veya 2).
Çıktın ayrı satırlarda iki sonuç göstermelidir: aynı iki sayı kullanılarak gerçekleştirilen işlemlerin her biri için bir sonuç:
15
5Bu örnekte, 10, 5, 1, 2 girdileriyle: birinci 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 çıkarma işlemini yapar.
Bu, aynı işaretçi değişkeninin çağrılar arasında yeniden atanarak tamamen farklı mantıkları nasıl çalıştırabileceğini gösterir.
Kendin dene
#include <stdio.h>
// TODO: add fonksiyonunu burada tanımla
// TODO: subtract fonksiyonunu burada tanımla
int main() {
// Girdileri oku
int num1, num2, op1, op2;
scanf("%d", &num1);
scanf("%d", &num2);
scanf("%d", &op1);
scanf("%d", &op2);
// TODO: 'calc' adında, şunlara işaret edebilen bir fonksiyon işaretçisi bildir
// iki int parametre alan ve bir int döndüren fonksiyonlara
// TODO: İlk işlem kodu (op1) için:
// - Uygun fonksiyonu calc'a ata (add için 1, subtract için 2)
// - Fonksiyonu işaretçi üzerinden çağır ve sonucu yazdır
// TODO: İkinci işlem kodu (op2) için:
// - calc'ı uygun fonksiyona yeniden ata
// - Fonksiyonu işaretçi üzerinden çağır ve sonucu yazdır
return 0;
}Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama 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şisiKendi başına pratik yap: Online C derleyicisi