C Programlama #38 | İşaretçi Dizileri

İşaretçiler (Pointers)

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

Bir kâğıt oyunu yazacağız: 52 kart, dört renk, on üç değer. Uzunlukları farklı adları (Kupa, Sinek, Papaz…) tek bir dizide nasıl tutarız? Otuz sekizinci derste elemanları adres olan dizileri, yani işaretçi dizilerini tanıyor ve onlarla bir desteyi karıştırıp dağıtıyoruz. const char *renk[4] dört elemanlı bir dizidir ve her elemanı sabit bir char'ı gösteren bir işaretçidir: dizinin içinde metinlerin kendisi değil, ilk harflerinin adresleri vardır. sizeof renk 32 bayt (4 · 8, dört adres); her eleman yine bir metin gibi kullanılır (uzunluklar 4, 4, 5, 4; renk[i][0] ilk harf). lldb ile bakınca dizinin yığında durduğunu, metinlerin ise programın kendi bölgesinde olduğunu görüyoruz: memory read ile dizinin 32 baytında aynı dört adres var. Uzunlukları çok farklı dört mesajda iki boyutlu char dizisi her satıra en uzun metin kadar yer ayırır: 4 · 41 = 164 bayt; işaretçi dizisinde 32 bayt adres + 70 bayt metin = 102 bayt. Ardından kitabın 4 × 13 deste dizisiyle kartları karıştırıyoruz: her kart için boş bir yer bulana kadar rastgele satır ve sütun çekiliyor. srand(7) ile 52 kart için 230 çekiliş gerekiyor; 49. kart tek başına 42 çekiliş bekliyor (belirsiz erteleme). Her kartın çekiliş sayısını bir grafikte görüyoruz: deste doldukça boş yer bulmak zorlaşıyor. Dağıtımda her kart için dizinin 52 yerine bakılıyor (52 · 52 = 2704 karşılaştırma); renk[s] ve deger[d] adları işaretçi dizilerinden getiriyor. İlk kartı elle de hesaplıyoruz: rand() = 16807 · 7 = 117649, 117649 % 4 = 1 → Karo; 1977326743 % 13 = 2 → 3; program da Karo 3 yazıyor ve 52 kartın sırası Python modeliyle birebir aynı. Son olarak daha iyi bir yol: her kartı rastgele bir kartla takas etmek (tam 51 çekiliş, bekleyen kart yok). Ekrandaki her çıktı, kodun gerçekten derlenip çalıştırılmasından geliyor. Bu derste: 1. İşaretçi dizisi: elemanları metinlerin adresleri 2. lldb: dizi yığında, metinler programın kendi bölgesinde 3. 2B char dizisi 164 bayt, işaretçi dizisi 102 bayt 4. Kart karıştırma: 230 çekiliş ve belirsiz erteleme 5. Takasla karıştırma: tam 51 çekiliş Bölümler: 0:00 İşaretçi dizileri 0:15 Kâğıt oyunu: kartların adları 0:38 Cevap: bir işaretçi dizisi 1:15 lldb: dizide adresler, metinler başka yerde 1:42 İki boyutlu dizi mi, işaretçi dizisi mi? 2:15 Deste: 4 × 13 dizi 2:54 Dağıtmak: kart adları işaretçi dizilerinden 3:22 Belirsiz erteleme 3:57 Daha iyi karıştırma: takas 4:24 Bugünün dört kuralı 4:50 Sonraki ders: fonksiyon işaretçileri Kaynak kitap: Paul Deitel, Harvey Deitel — C How to Program, 9. baskı (2022), §7.10–7.11. 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–#37.

Bu videoyu izlemek için Premium üyelik gerekir.