C Programlama #25 | Dizileri Fonksiyonlara Geçirmek ve static Diziler
Diziler (Arrays)Eğitmen: Dr. Süleyman Burak ÇELİK
Bir fonksiyon, kendisine verilen diziyi değiştirebiliyor ama tek bir elemanı değiştiremiyor. Yirmi beşinci derste nedenini lldb ile adresleri karşılaştırarak görüyor, static yerel dizileri ve scanf'teki & sorusunun cevabını öğreniyoruz. Beş öğrencinin puanları 62, 75, 48, 90 ve 55. bonus_ekle fonksiyonu diziyi ve boyunu alıp her puana 5 ekliyor (62 + 5 = 67, 75 + 5 = 80); çağrıdan sonra main'deki dizi gerçekten değişmiş: 67, 80, 53, 95, 60. Aynı işi tek bir elemana yapınca, puan[2]'yi tek_bonus'a verince, fonksiyonun içinde değer 58 oluyor ama dönünce puan[2] hâlâ 53. Cevap fonksiyona giden şeyde: dizinin adı ilk elemanının adresidir. lldb ile bonus_ekle'nin içinde duruyoruz: p parametresinin değeri, main'deki puan dizisinin adresiyle aynı; p[i] doğrudan main'in hücrelerine yazıyor. Bunun bir sonucu, fonksiyonun dizinin boyunu bilmemesi: main'de sizeof puan 20 bayt (5 · 4), fonksiyonun içinde sizeof d ise 8, çünkü d bir adres tutuyor; gcc bunu -Wsizeof-array-argument uyarısıyla da söylüyor. Bu yüzden eleman sayısını ayrıca geçiriyoruz. Tek bir eleman ise değerle geçer: lldb'de puan[2] dizinin başından 2 · 4 = 8 bayt ileride, x'in adresi bambaşka; kopya 58 olur ve fonksiyonla birlikte yok olur. Yalnızca okuyan fonksiyonlarda dizi parametresini const yapıyoruz: const bir diziye yazmaya çalışan fonksiyonu gcc de clang da derlemiyor. static yerel dizi program başlarken bir kez kurulur, ilk değer verilmezse sıfırlarla başlar ve değerini çağrılar arasında korur: üç çağrıda 1, 2, 3; otomatik dizi her seferinde 1. lldb'de static dizi programın veri alanında, otomatik dizi yığında. Son olarak scanf'e her zaman bir adres gider: dizide adın kendisi zaten adrestir (ad == &ad[0]); &ad yazınca gcc tür uyarısı veriyor: aynı yer ama farklı tür. Ekrandaki her çıktı, kodun gerçekten derlenip çalıştırılmasından geliyor. Bu derste: 1. Dizinin adı ilk elemanının adresidir: fonksiyon diziyi değiştirebilir (lldb ile aynı adres) 2. Fonksiyon dizinin boyunu bilmez: sizeof 20 ve 8; eleman sayısını ayrıca geçirmek 3. Tek eleman değerle geçer: kopya değişir, asıl değişmez 4. const dizi parametresi ve static yerel diziler (veri alanı ve yığın) 5. scanf'te & sorusunun cevabı: ad == &ad[0] Bölümler: 0:00 Dizileri fonksiyonlara geçirmek 0:17 Dizi değişti, eleman değişmedi 0:58 Dizinin adı bir adrestir 1:38 Fonksiyon dizinin boyunu bilmez 2:08 Tek eleman değerle geçer 2:38 Yalnızca okuyan fonksiyon: const 3:04 static yerel diziler 3:50 scanf'e her zaman bir adres 4:31 Bugünün dört kuralı 4:54 Sonraki ders: kabarcık sıralaması Kaynak kitap: Paul Deitel, Harvey Deitel — C How to Program, 9. baskı (2022), §6.6–6.7. 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–#24.
Bu videoyu izlemek için Premium üyelik gerekir.