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

Kopya kağıdı

Bir void*, herhangi bir veri tipinin adresini tutabilen genel bir işaretçidir. C'de genel kod yazmak için esneklik sağlar.

Bir void* işaretçisinin değerine doğrudan erişemezsiniz (dereference yapamazsınız) — önce onu doğru tipe dönüştürmeniz (cast etmeniz) gerekir:

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

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

Genel fonksiyonlar, veriyi doğru şekilde nasıl yorumlayacaklarını bilmek için genellikle bir void* işaretçisini bir tip belirteciyle (enum veya bayrak gibi) eşleştirir. Yanlış tipe dönüştürmek, belirsiz davranışlara (undefined behavior) veya çökmelere neden olabilir.

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