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.
Görev
Kolayprint_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ğı
0ise işaretçiyiint*türüne dönüştürün ve tamsayı değerini yazdırın - Tür bayrağı
1ise işaretçiyifloat*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:
- Bir tür bayrağı (tamsayı için
0, kayan nokta için1) - 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ı:
42Girdiler 1 ve 3.14 olduğunda örnek çıktı:
3.14Girdiler 0 ve -17 olduğunda örnek çıktı:
-17Girdiler 1 ve 99.5 olduğunda örnek çıktı:
99.50Kendin 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;
}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
1Modüler Programlama Temelleri
Başlık DosyalarıInclude Guard'larKaynak DosyalarıStatik FonksiyonlarÖzet: Modüler Hesap Makinesi4Kapsülleme
Opaque Pointer KavramıOpaque Struct TanımlamaGetter ve Setter MetotlarıSetter Metotlarında DoğrulamaÖzet: Gizli Kutu7Fonksiyon İşaretçileri
Fonksiyon İşaretçilerini TanımlamaFonksiyon İşaretçilerini ÇağırmaFonksiyon İşaretçileri için TypedefFonksiyonları Argüman Olarak GeçirmeÖzet: Hesap Makinesi Yönlendirme10Jenerik Kapsayıcılar
Void İşaretçiler ÖzetiJenerik SarmalayıcıJenerik Yer DeğiştirmeJenerik KarşılaştırmaÖzet: Jenerik Dizi2Nesneler ve Metotlar
Nesne Olarak Struct'lar'Self' İşaretçisiConst Doğruluğuİşaretçi vs DeğerYardımcı MetotlarÖzet: Point Manager5Proje: Basit Banka Hesabı
Proje KurulumuHesabın Oluşturulması3Nesne Yaşam Döngüsü
Constructor DeseniDestructor DeseniStack İlklendirmeDerin KopyalamaÖzet: String Wrapper6Kompozisyon Yoluyla Kalıtım
Struct Gömmeİlk Üye KuralıÜst Üyelere ErişimUpcastingÖzet: Şekil HiyerarşisiKendi başına pratik yap: Online C derleyicisi