Menu
Coddy logo textTech

Fonksiyon İşaretçilerini Tanımlama

Coddy'nin C Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 33 / 61.

Şimdiye kadar struct gömme (embedding) kullanarak kalıtımı simüle etmeyi öğrendik. Ancak gerçek çok biçimlilik (polymorphism) — farklı nesnelerin aynı çağrıya farklı yanıtlar vermesi — daha fazlasını gerektirir: fonksiyon göstericileri (function pointers).

Bir `function` `pointer`'ı, bir `function`'ın adresini saklayan bir değişkendir. Tıpkı normal bir `pointer`'ın verinin adresini tutması gibi, bir `function` `pointer`'ı da çalıştırılabilir kodun adresini tutar.

Sözdizimi ilk bakışta korkutucu görünebilir. Bir function pointerDeclare etmek için, önce return türünü, ardından parantez içinde bir yıldız işareti ile pointer adını ve ardından parameters 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 bildirir. *operation etrafındaki parantezler çok önemlidir — onlar olmadan, bir işaretçi döndüren bir fonksiyon bildirmiş olursunuz.

Bu göstericiye bir işlev atamak için yalnızca işlevin adını (parantez olmadan) kullanmanız yeterlidir:

int add(int a, int b) {
    return a + b;
}

int (*operation)(int, int);
operation = add;  // Şimdi operation, add'e işaret ediyor

Fonksiyon adı, onun adresi olarak işlev görür. Ayrıca açıkça &add de kullanabilirsiniz, ancak bu isteğe bağlıdır — C'de her iki kullanım da eşdeğerdir.

challenge icon

Görev

Kolay

Fonksiyon işaretçilerini (function pointers) bildirmeyi ve fonksiyonları bunlara atamayı pratik edelim. Bir fonksiyon işaretçisinin farklı aritmetik fonksiyonları tutabileceği basit bir matematiksel işlem sistemi oluşturacaksınız.

Şunları yapan bir program yazın:

  1. İki fonksiyon tanımlar:
    • multiply — iki int parametresi alır ve bunların çarpımı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ı gösterebilen operation adında bir fonksiyon işaretçisi değişkeni bildirir
  3. Üç girdi okur: iki tam sayı ve bir işlem kodu (multiply için 1, subtract için 2)
  4. İşlem koduna dayanarak, operation işaretçinize uygun fonksiyonu atar
  5. Atanan işlemin adını yazdırır, ardından işaretçi aracılığıyla fonksiyonu çağırmanın sonucunu yazdırır

Üç girdi alacaksınız: ilk sayı, ikinci sayı ve işlem kodu (1 veya 2).

Çıktınız şu şekilde görünmelidir:

Operation: multiply
Result: 35

Burada multiply işlem adıdır (kod 2 ise subtract olur) 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üş türüne, parantez içinde yıldız işareti ile birlikte işaretçi adına ve parametre türlerine ihtiyacınız vardır. Bir fonksiyon atamak için parantez olmadan yalnızca fonksiyon adını kullanın.

Kendin dene

#include <stdio.h>

// TODO: multiply fonksiyonunu burada tanımla


// TODO: subtract fonksiyonunu burada tanımla


int main() {
    int num1, num2, code;
    
    // Girdiyi oku
    scanf("%d", &num1);
    scanf("%d", &num2);
    scanf("%d", &code);
    
    // TODO: 'operation' adında, şunlara işaret edebilecek bir fonksiyon işaretçisi bildir
    // iki int parametre alan ve bir int döndüren fonksiyonlar
    
    
    // TODO: İşlem koduna göre (1 multiply için, 2 subtract için),
    // uygun fonksiyonu operation işaretçinize atayın
    
    
    // TODO: İşlem adını ve sonucu yazdır
    // Biçim:
    // Operation: <name>
    // Result: <result>
    
    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