Özet - İleri işaretçiler
- C kursu
- Orta seviye
- Ders 6/116
- 5 dk
Çift işaretçi, fonksiyon işaretçisi ve void*'i birleştirerek bir sıralama uygulaması yazarsın.
İleri işaretçileri birleştir
Bu grupta dört kavram öğrendin: çift işaretçi (**), işaretçi dizisi, fonksiyon işaretçisi ve void *. Şimdi hepsini bir sıralama uygulamasında birleştireceğiz.
Sıralama fonksiyonu, bir int * işaretçi dizisini int ** olarak alır. Karşılaştırmayı bir fonksiyon işaretçisi int (*cmp)(int, int) üzerinden yapar. İşaretçi dizisini bir void * genel işaretçi üzerinden geçiririz; bu, gerçek kütüphane API'lerindeki esnekliği taklit eder. Böylece tek bir sıralama fonksiyonu, farklı karşılaştırmalarla çalışabilir.
Uygulama İşaretçi dizisini sırala
int greater(int a, int b) yaz; a > b döndürsün. void sort_ptrs(int **items, int n, int (*cmp)(int, int)) tanımla; bubble sort ile cmp doğruysa komşu işaretçileri yer değiştirsin (swap int * tmp ile). main içinde int v[3] = {5, 2, 8}; ve int *ptrs[3] = {&v[0], &v[1], &v[2]}; tanımla. void *generic = ptrs; ve int **items = (int **)generic; yaz. sort_ptrs(items, 3, greater) çağır, sonra for ile *items[i]'i printf ile yazdır.
Başlangıç kodu
#include <stdio.h>
// greater fonksiyonunu yaz
// sort_ptrs fonksiyonunu yaz
// main içinde diziyi sırala ve yazdır
int main(void) {
return 0;
}Örnek çözüm
#include <stdio.h>
int greater(int a, int b) { return a > b; }
void sort_ptrs(int **items, int n, int (*cmp)(int, int)) {
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - 1 - i; j++) {
if (cmp(*items[j], *items[j + 1])) {
int *tmp = items[j];
items[j] = items[j + 1];
items[j + 1] = tmp;
}
}
}
}
int main(void) {
int v[3] = {5, 2, 8};
int *ptrs[3] = {&v[0], &v[1], &v[2]};
void *generic = ptrs;
int **items = (int **)generic;
sort_ptrs(items, 3, greater);
for (int i = 0; i < 3; i++) printf("%d ", *items[i]);
printf("\n");
return 0;
}Beklenen çıktı
2 5 8
Özet
Bu grupta ileri işaretçi kavramlarını öğrendin. Çift işaretçi bir işaretçinin adresini tutar; işaretçi dizisi dize listeleri gibi verilerde yaygındır; fonksiyon işaretçisi çağrılacak davranışı çalışma anında seçtirir; void * türü kaybedilmiş genel bir işaretçidir ve açık çevrim gerektirir.
Bunları birleştirerek esnek bir sıralama uygulaması yazdın. Sonraki gruplarda bu kavramlar, bellek yönetimi ve dinamik veri yapılarında tekrar karşına çıkacak. Özellikle qsort ve callback desenleri, bu temeller üzerine kuruludur.
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Kavramları kullanımlarıyla eşle
| Kavram | Anlamı |
|---|---|
int **items |
Çift işaretçi |
int (*cmp)(int, int) |
Fonksiyon işaretçisi |
void *generic |
Genel işaretçi |
int *ptrs[3] |
İşaretçi dizisi |
2 Sıralama fonksiyonunda void* ne işe yarar?
- Döngüde kullanılır
- İşaretçi dizisini genel olarak taşır Doğru cevap
- Karşılaştırma yapar
- Değer yazdırır
Açıklama: Void* işaretçi dizisini genel olarak taşır, sonra int**'a çevrilir.