CodeBlanks Logo Icon CodeBlanks

Ö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

main.c
#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

main.c
#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.

Orta seviye bölümündeki tüm dersler