void işaretçi
- C kursu
- Orta seviye
- Ders 5/116
- 5 dk
void* ile genel işaretçi kullanmayı öğrenirsin.
void işaretçi (void*)
Bir void işaretçi (void *), türü bilinmeyen bir adresi tutan genel işaretçidir. Herhangi bir veri türüne işaretçi, void *'a örtülü çevrilebilir.
Örnek: int x = 5; void *p = &x;. Burada p bir int'a işaret eder ama türü kaybedilmiştir. p üzerinden değere erişmek için önce doğru türe çevirmelisin: *(int *)p size 5 verir. void *, malloc'un dönüş türüdür ve genel veri yapılarının (ör. ağaç düğümü) temelidir.
void* ile genel fonksiyon
void * sayesinde tek bir fonksiyon farklı türlerle çalışabilir. Standart kütüphanedeki qsort bunun en bilinen örneğidir: void * tabanlı bir dizi alır ve türden bağımsız sıralar.
Örnek bir genel yazdırma: void print_int(void *p) { printf("%d\n", *(int *)p); }. Bu fonksiyon bir int *'ı void * üzerinden alır ve yazdırır. Avantajı, aynı imzayı kullanarak farklı türler için benzer fonksiyonlar yazabilmen; dezavantajı, tür güvenliğinin derleme anında kaybolmasıdır.
Uygulama void* ile int yazdır
void print_int(void *p) fonksiyonu yaz; içinde *(int *)p değerini printf ile yazdır. main içinde int x = 99; tanımla, print_int(&x) çağrısı yap.
Başlangıç kodu
#include <stdio.h>
// print_int fonksiyonunu yaz
// main içinde int tanımla ve çağır
int main(void) {
return 0;
}Örnek çözüm
#include <stdio.h>
void print_int(void *p) {
printf("%d\n", *(int *)p);
}
int main(void) {
int x = 99;
print_int(&x);
return 0;
}Beklenen çıktı
99
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 void *p ile int değere nasıl erişilir?
- p->int
- *p
- p.int
- *(int *)p Doğru cevap
Açıklama: Önce (int *) ile çevirip sonra * ile dolaylarsın.
2 void*'ı int'a çevir ve yazdır
int x = 7;
void *p = &x;
printf("%d\n", *(int *)____);
int x = 7;
void *p = &x;
printf("%d\n", *(int *)p);
Açıklama: p void*'dır; önce (int *) ile çevrilip sonra * ile dolaylanır.
3 void* kullanımını eşle
| Kavram | Anlamı |
|---|---|
void *p |
Genel işaretçi |
(int *)p |
Türe çevrim |
*(int *)p |
Değere erişim |
void *malloc(...) |
Tahsis dönüşü |