C Programlama #33 | Argümanları Başvuru ile Geçirme

İşaretçiler (Pointers)

Eğitmen: Dr. Süleyman Burak ÇELİK

Bir fonksiyon, kendisini çağıranın değişkenlerini nasıl değiştirebilir? Otuz üçüncü derste & ve * işleçlerini fonksiyonlarla kullanıyoruz: iki değişkenin değerlerini takas eden bir fonksiyonu önce değer ile, sonra başvuru ile yazıyoruz. main'de a 3, b 8; takas fonksiyonu geçici bir değişkenle x ile y'yi yer değiştiriyor ve içeride x 8, y 3 oluyor; ama main'e dönünce a hâlâ 3, b hâlâ 8. Nedeni: C argümanları değer ile geçirir; fonksiyon kopyalarla çalışır. Kopyaları adım adım izliyoruz, lldb ile de x ve y'nin adreslerinin a ile b'ninkilerden farklı olduğunu görüyoruz. Çözüm başvuru ile geçirme: parametreler int * oluyor, çağrı takas(&a, &b); fonksiyonun içinde *x a'nın, *y b'nin kendisi ve sonuç a 8, b 3. lldb ile x'in değerinin a'nın adresi olduğunu görüp üç satırı adım adım izliyoruz: gecici 3, a 8, b 3. & unutulursa gcc 'makes pointer from integer without a cast' diyor ve adresi & ile almayı öneriyor; clang da aynı çözümü öneriyor. Fonksiyonun elindeki işaretçi zaten bir adres olduğundan başka bir fonksiyona & koymadan aktarılır: kucuk_once fonksiyonu 9 4'ten büyük olduğu için takas(x, y) çağırıyor ve sonuç a 4, b 9 (kabarcık sıralamasında bu kalıbı kullanacağız). return en fazla bir değer döndürür; iki işaretçi parametreyle bir fonksiyon iki sonuç verebilir: 17 / 5 = 3, 5 · 3 = 15, 17 − 15 = 2, yani bölüm 3, kalan 2 (scanf de böyle çalışır). Dizilerin neden & olmadan geçtiğini ve 25. dersteki bonus_ekle / tek_bonus farkının nedenini açıklıyoruz: dizi adresiyle gider, tek eleman kopyalanır; int b[] parametresi int *b ile aynıdır (3 + 8 = 11, 11 + 5 = 16). Son olarak en az yetki ilkesini ve bugünün dört kuralını özetliyoruz. Ekrandaki her çıktı, kodun gerçekten derlenip çalıştırılmasından geliyor. Bu derste: 1. Değer ile geçirme: takas kopyalarda olur, main'in değişkenleri değişmez 2. Başvuru ile geçirme: int * parametreler ve takas(&a, &b); lldb ile adım adım 3. & unutulursa: gcc ve clang hatası ve önerdikleri çözüm 4. Elindeki işaretçiyi başka fonksiyona & koymadan aktarmak; iki sonucu birden vermek 5. Dizi parametresi aslında işaretçi; en az yetki ilkesi Bölümler: 0:00 Başvuru ile geçirme 0:17 Takas neden olmadı? 0:40 Değer ile geçirme: kopyalar 1:18 Başvuru ile geçirme 1:46 Adım adım: işaretçiyle takas 2:18 & unutulursa 2:39 İşaretçiyi başka fonksiyona aktarmak 3:12 İki sonucu birden vermek 3:44 Dizi parametresi bir işaretçidir 4:21 Hangisi, ne zaman? 4:51 Bugünün dört kuralı 5:13 Sonraki ders: const ve işaretçiler Kaynak kitap: Paul Deitel, Harvey Deitel — C How to Program, 9. baskı (2022), §7.4. Konu sırası ve kavramlar kaynak kitaptan izlenir; anlatım, örnekler ve ekranlar özgündür. Hedef kitle: C'ye yeni başlayan tüm mühendislik ve bilgisayar/yazılım öğrencileri. Ön koşul: C Programlama #01–#32.

Bu videoyu izlemek için Premium üyelik gerekir.