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.
Görev
Kolayİşaretçileri kullanarak klasik swap işlevini uygulayan ve gösteren bir C programı yaz. Programın şunları yapması gerekir:
- Parametre olarak iki tamsayı işaretçisi alan
swapadlı bir işlev oluştur swapişlevinin içinde, geçici bir değişken kullanarak iki işaretçinin gösterdiği bellek adreslerindeki değerleri birbirleriyle değiştirmainişlevinde kullanıcı girdisinden iki tamsayı oku- Özgün değerleri şu biçimde yazdır:
Before swap: a = [value], b = [value] swapişlevini çağır ve adres alma operatörünü kullanarak her iki değişkenin adreslerini gönder- İş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;
}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
1Pointer Temelleri
Pointer Nedir?Pointer TanımlamaAdres Operatörü (&)Dereference Operatörü (*)NULL Pointer'larÖzet: Pointer Temelleri4Proje: Basit Metin Aracı
Projeye Genel BakışKarakter Sayma2İşaretçiler ve Diziler
İşaretçi Olarak Dizi İsimleriDizi Elemanları - İşaretçilerİşaretçi Aritmetiğiİşaretçilerin KarşılaştırılmasıÖzet: İşaretçi ile Dizi Gezinme5İşaretçiler ve Fonksiyonlar
Değer ile GeçmeFonksiyonlara İşaretçi Göndermeİşaretçiler ile Değişkenleri DeğiştirmeKlasik Bir Örnek: SwapFonksiyonlara Dizi GöndermeÖzet: Fonksiyon İşaretçi Argümanları8Yapılar ve İşaretçiler
Yapılara İşaretçilerOk Operatörü (->)Yapıları Değer ile AktarmaYapı İşaretçilerini AktarmaYapıların Dinamik TahsisiÖzet: Yapıyı Değiştirme - Ptr11Son Tekrar Görevleri
Tekrar: Dinamik String BirleştirmeTekrar: Struct DizisiTekrar: Kelime Frekans Sayacı3Karakter Dizileri ve Stringler
char Dizisi Olarak StringlerNull Sonlandırıcıscanf ile String Girişistrlen() Kullanımıstrcpy() Kullanımıstrcat() Kullanımıstrcmp() KullanımıÖzet: Temel String FonksiyonlarıKendi başına pratik yap: Online C derleyicisi