Menu
Coddy logo textTech

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ı: 2

Aynı 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.

challenge icon

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:

  1. İki fonksiyon tanımlar:
    • add — iki int parametresi alır ve toplamlarını döndürür
    • subtract — iki int parametresi alır ve birinciden ikinciyi çıkararak sonucu döndürür
  2. main içinde, iki int parametresi alan ve bir int döndüren fonksiyonları işaret edebilen calc adında bir fonksiyon işaretçisi tanımlar
  3. Dört girdi okur: iki tam sayı ve iki işlem kodu
  4. Her işlem kodu için:
    • calc iş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
5

Bu ö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ı: 2

Bu, 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;
}
quiz iconKendini test et

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