Menu
Coddy logo textTech

Void İşaretçiler Özeti

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

Bir void*, C'de "bir şeye işaretçi, ama ne olduğunu söylemiyorum" demenin yoludur. Herhangi bir veri türünün adresini tutabilir: bir int, bir float, bir yapı veya başka herhangi bir şey. Bu, onu C'de genel amaçlı kod yazmanın temel unsuru hâline getirir.

Ancak bunun bir sakıncası vardır: Bir void* işaretçisinin başvurusunu doğrudan kaldıramazsınız. Derleyici kaç bayt okuyacağını veya bunları nasıl yorumlayacağını bilmez. Veriyi kullanmak için onu doğru türe geri dönüştürmeniz 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ış türe dönüştürürseniz derleyici sizi durdurmaz, ancak programınız anlamsız veriler üretebilir veya çökebilir. Bu nedenle genel amaçlı işlevler çoğu zaman bir void* işaretçisini, işlevin veriyi nasıl doğru yorumlayacağını bilmesini sağlayan bir tür göstergesiyle (örneğin bir enum veya bayrakla) birlikte kullanır.

Yaklaşan derslerde, herhangi bir veri türünü depolayabilen kapsayıcılar oluşturmak için void* kullanacak ve gerçekten yeniden kullanılabilir veri yapıları oluşturacaksınız.

challenge icon

Görev

Kolay

print_value adında iki parametre kabul eden bir işlev yazın: verilere işaret eden bir void* işaretçisi ve bir int türü bayrağı. İşlev, tür bayrağına göre verileri yorumlamalı ve yazdırmalıdır:

  • Tür bayrağı 0 ise işaretçiyi int* türüne dönüştürün ve tamsayı değerini yazdırın
  • Tür bayrağı 1 ise işaretçiyi float* türüne dönüştürün ve kayan nokta değerini 2 ondalık basamakla yazdırın

Programınız iki girdi alacaktır:

  1. Bir tür bayrağı (tamsayı için 0, kayan nokta için 1)
  2. Sayısal bir değer

Tür bayrağına göre değeri uygun değişken türünde saklayın, ardından bu değişkene işaretçi ve tür bayrağıyla print_value işlevini ç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 fonksiyonunu buraya yaz


int main() {
    int type_flag;
    scanf("%d", &type_flag);
    
    if (type_flag == 0) {
        int int_value;
        scanf("%d", &int_value);
        
        // TODO: print_value'yu int_value'ya bir işaretçi ve type_flag ile çağır
        
    } else if (type_flag == 1) {
        float float_value;
        scanf("%f", &float_value);
        
        // TODO: print_value'yu float_value'ya bir işaretçi ve type_flag ile çağır
        
    }
    
    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