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.

Ş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 ediyor

Fonksiyon 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.

challenge icon

Görev

Kolay

Fonksiyon 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:

  1. İki fonksiyon tanımlar:
    • multiply — iki int parametresi alır ve çarpımları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 operation adında bir fonksiyon işaretçisi değişkeni bildirir
  3. Üç girdi okur: iki tam sayı ve bir işlem kodu (çarpma için 1, çıkarma için 2)
  4. İşlem koduna bağlı olarak, uygun fonksiyonu operation işaretçinize atar
  5. 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: 35

Burada 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 ediyor

Fonksiyon 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;
}
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