Menu
Coddy logo textTech

Fonksiyon İşaretçilerini Tanımlama

Coddy'nin C Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 33 / 61.

Şimdiye kadar struct gömmeyi kullanarak kalıtımı simüle etmeyi öğrendik. Ancak farklı nesnelerin aynı çağrıya farklı şekilde yanıt verdiği gerçek çok biçimlilik için daha fazlası gerekir: işlev işaretçileri.

Fonksiyon işaretçisi, bir fonksiyonun adresini depolayan bir değişkendir. Normal bir işaretçinin verilerin adresini tutması gibi, bir fonksiyon işaretçisi de yürütülebilir kodun adresini tutar.

Sözdizimi ilk başta göz korkutucu görünebilir. Bir işlev işaretçisi bildirmek için dönüş türünü, ardından parantez içinde yıldız işaretiyle 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 işleve işaret edebilen operation adlı bir değişken tanımlar. *operation çevresindeki parantezler çok önemlidir; bunlar olmadan bir işaretçi döndüren bir işlev tanımlamış olurdunuz.

Bu işaretçiye bir işlev atamak için işlevin adını (parantezler 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ı, adresi olarak işlev görür. Ayrıca açıkça &add kullanabilirsin, ancak bu isteğe bağlıdır: C'de her iki biçim de eşdeğerdir.

challenge icon

Görev

Kolay

İşlev işaretçilerini tanımlama ve işlevleri bunlara atama alıştırması yapalım. Bir işlev işaretçisinin farklı aritmetik işlevleri tutabildiği basit bir matematik işlemi sistemi oluşturacaksın.

Şunları yapan bir program yaz:

  1. İki işlev tanımla:
    • multiply: iki int parametresi alır ve bunların çarpımını döndürür
    • subtract: iki int parametresi alır ve birinciden ikincinin çıkarılmasının sonucunu döndürür
  2. main içinde, iki operation parametresi alan ve bir int döndüren işlevleri gösterebilen int adlı bir işlev işaretçisi değişkeni tanımla
  3. Üç girdi oku: iki tam sayı ve bir işlem kodu (çarpma için 1, çıkarma için 2)
  4. İşlem koduna bağlı olarak uygun işlevi operation işaretçine ata
  5. Atanan işlemin adını yazdır, ardından işlevi işaretçi üzerinden çağırmanın sonucunu yazdır

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

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

Operation: multiply
Result: 35

Burada multiply işlem adıdır (kod 2 ise subtract) ve 35, işlevin işaretçin üzerinden çağrılmasının sonucudur (bu durumda 5 × 7).

Unutma: işlev işaretçisini tanımlamak için dönüş türüne, parantez içinde yıldız işaretiyle birlikte işaretçi adına ve parametre türlerine ihtiyacın vardır. Bir işlev atamak için parantezleri olmadan yalnızca işlev adını kullan.

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, işaret edebilecek bir fonksiyon işaretçisi bildir
    // iki int parametre alan ve bir int döndüren fonksiyonlara
    
    
    // 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.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online C derleyicisi