Menu
Coddy logo textTech

Klasik Bir Örnek: Swap

Coddy'nin C Journey'sinin Mantık & Akış bölümünün bir parçası. Ders 28 / 63.

swap işlevi, işaretçilerin C programlamada neden vazgeçilmez olduğunu gösteren en ünlü örneklerden biridir. Amaç basittir: iki değişkenin değerlerini değiştiren bir işlev yazmak. Ancak görünüşte basit olan bu görev, değere göre geçirmenin temel bir sınırlamasını ortaya çıkarır.

Normal değerle geçirme yöntemini kullanarak iki değişkeni değiştirmeye çalışırsanız ne olduğunu düşünün:

void badSwap(int a, int b) {
    int temp = a;
    a = b;
    b = temp;
    // Bu yalnızca kopyaları değiştirir, orijinal değişkenleri değil!
}

Bu yaklaşım başarısız olur çünkü fonksiyon değerlerin yalnızca kopyalarını alır. Çağıran fonksiyondaki orijinal değişkenler değişmeden kalır.

Çözüm, bunun yerine değişkenlere işaretçiler geçirmeyi gerektirir:

void swap(int *a, int *b) {
    int temp = *a;  // a adresindeki değeri sakla
    *a = *b;        // b adresindeki değeri a adresine koy
    *b = temp;      // Saklanan değeri b adresine koy
}

Değişkenlerin adreslerini geçirip başvuru kaldırma operatörünü kullanarak işlev, özgün değişkenlerin değerlerini doğrudan değiştirebilir. Bu, swap işlevini, değerle geçirmenin tek başına gerçekleştiremeyeceği görevleri yerine getirmek için işaretçilere ne zaman ve neden ihtiyaç duyduğunuzu gösteren mükemmel bir örnek hâline getirir.

challenge icon

Görev

Kolay

İşaretçileri kullanarak klasik swap işlevini uygulayan ve gösteren bir C programı yaz. Programın şunları yapması gerekir:

  1. Parametre olarak iki tamsayı işaretçisi alan swap adlı bir işlev oluştur
  2. swap işlevinin içinde, geçici bir değişken kullanarak iki işaretçinin gösterdiği bellek adreslerindeki değerleri birbirleriyle değiştir
  3. main işlevinde kullanıcı girdisinden iki tamsayı oku
  4. Özgün değerleri şu biçimde yazdır: Before swap: a = [value], b = [value]
  5. swap işlevini çağır ve adres alma operatörünü kullanarak her iki değişkenin adreslerini gönder
  6. İşlev çağrısından sonra, değiştirilen değerleri şu biçimde yazdır: After swap: a = [value], b = [value]

Çıktın, işlevin özgün değişkenlerin değerlerini başarıyla değiştirdiğini göstermelidir:

Before swap: a = [first_input], b = [second_input]
After swap: a = [second_input], b = [first_input]

Bu meydan okuma, işaretçilerin swap işlemi için neden gerekli olduğunu gösterir - işlev, değerleri kalıcı olarak değiştirmek için özgün değişkenlerin bellek konumlarına erişmelidir; bu da değerle geçirme ile mümkün değildir.

Kendin dene

#include <stdio.h>

// YAPILACAK: Takas (swap) fonksiyonunuzu buraya yazın

int main() {
    int a, b;
    
    // Girdiyi oku
    scanf("%d", &a);
    scanf("%d", &b);
    
    // Orijinal değerleri yazdır
    printf("Before swap: a = %d, b = %d\n", a, b);
    
    // YAPILACAK: Takas (swap) fonksiyonunuzu burada çağırın
    
    // Takas edilmiş değerleri yazdır
    printf("After swap: a = %d, b = %d\n", a, b);
    
    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.

Mantık & Akış bölümündeki tüm dersler

Kendi başına pratik yap: Online C derleyicisi