Menu
Coddy logo textTech

Void İşaretçiler Özeti

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

Bir void*, C'nin "bir şeye işaret eden bir işaretçi, ama ne olduğunu söylemiyorum" deme şeklidir. Herhangi bir veri tipinin adresini tutabilir — bir int, bir float, bir struct veya başka herhangi bir şey. Bu, C'de genel (generic) kod yazmanın temelini oluşturur.

Buradaki püf noktası, bir void* işaretçisini doğrudan dereference edememenizdir (içeriğine erişemezsiniz). Derleyici kaç bayt okunacağını veya bunların nasıl yorumlanacağını bilmez. Veriyi kullanmak için onu doğru tipe geri dönüştürmeniz (cast) gerekir:

void print_int(void* data) {
    int* p = (int*)data;
    printf("%d\n", *p);
}

int main() {
    int x = 42;
    print_int(&x);
    return 0;
}

Bu esneklik beraberinde sorumluluk getirir. Yanlış tipe dönüştürürseniz, derleyici sizi durdurmaz — ancak programınız anlamsız veriler üretir veya çöker. Bu nedenle genel fonksiyonlar, fonksiyonun veriyi doğru şekilde nasıl yorumlayacağını bilmesi için genellikle bir void* ile bir tip göstergesini (bir enum veya bayrak gibi) eşleştirir.

Gelecek derslerde, her türlü veriyi depolayabilen kapsayıcılar (containers) oluşturmak için void* kullanacaksınız; bu da gerçekten yeniden kullanılabilir veri yapılarına olanak tanıyacak.

challenge icon

Görev

Kolay

Veriye yönelik bir void* işaretçisi ve bir int tip bayrağı (type flag) olmak üzere iki parametre kabul eden print_value adında bir fonksiyon yazın. Fonksiyon, veriyi tip bayrağına göre yorumlamalı ve yazdırmalıdır:

  • Eğer tip bayrağı 0 ise, işaretçiyi int* türüne dönüştürün ve tam sayı değerini yazdırın
  • Eğer tip bayrağı 1 ise, işaretçiyi float* türüne dönüştürün ve float değerini virgülden sonra 2 basamak olacak şekilde yazdırın

Programınız iki girdi alacaktır:

  1. Bir tip bayrağı (tam sayı için 0, float için 1)
  2. Sayısal bir değer

Tip bayrağına bağlı olarak, değeri uygun değişken türünde saklayın, ardından bu değişkenin işaretçisi ve tip bayrağı ile print_value fonksiyonunu çağırın.

Girdiler 0 ve 42 olduğunda örnek çıktı:

42

Girdiler 1 ve 3.14 olduğunda örnek çıktı:

3.14

Girdiler 0 ve -17 olduğunda örnek çıktı:

-17

Girdiler 1 ve 99.5 olduğunda örnek çıktı:

99.50

Kendin dene

#include <stdio.h>

// TODO: print_value fonksiyonunuzu buraya yazın


int main() {
    int type_flag;
    scanf("%d", &type_flag);
    
    if (type_flag == 0) {
        int int_value;
        scanf("%d", &int_value);
        
        // TODO: int_value göstericisi ve tip bayrağı ile print_value fonksiyonunu çağırın
        
    } else if (type_flag == 1) {
        float float_value;
        scanf("%f", &float_value);
        
        // TODO: float_value göstericisi ve tip bayrağı ile print_value fonksiyonunu çağı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