C Programlama #39 | Fonksiyon İşaretçileri

İşaretçiler (Pointers)

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

Aynı kabarcık sıralamasını bir gün küçükten büyüğe, bir gün büyükten küçüğe, bir gün de son basamağa göre isteriz. Her kural için fonksiyonu kopyalamak mı? Kopyalar arasındaki tek fark if satırındaki karşılaştırma. Otuz dokuzuncu derste o karşılaştırmayı sıralamaya dışarıdan veriyoruz: fonksiyon işaretçileriyle. Dizinin adı ilk elemanının adresiydi; fonksiyonun adı da makine kodunun başladığı adres. lldb ile p artan ve p f aynı adresi gösteriyor; türü (int (*)(int, int)), yani iki int alıp int döndüren bir fonksiyonun işaretçisi; image lookup bu adresin programın kod bölümünde, artan'ın ilk baytı olduğunu söylüyor. int (*f)(int a, int b) = artan; bildirimini parça parça okuyoruz: (*f) bir işaretçi, (int a, int b) gösterdiği şey iki int alan bir fonksiyon, en baştaki int dönüş türü; artan'ı verirken parantez koymuyoruz, çünkü çağırmıyor yalnızca adresini veriyoruz. Çağırmanın iki yolu f(5, 3) ve (*f)(5, 3) aynı sonucu (1) veriyor; f == artan 1, sizeof f 8. Parantezi kaldırınca int *g(int a, int b) artık bir işaretçi değil, int * döndüren bir fonksiyonun bildirimi: g = artan satırını gcc ve clang derlemiyor (clang türü açıkça yazıyor: int *(int, int)). Sonra kabarcık sıralamasına int (*takas_gerek)(int a, int b) parametresi ekliyoruz: kullanıcı 1 girince artan (3 7 19 23 42 56 61 88), 2 girince azalan (88 … 3); ilk karşılaştırmada artan(42, 7) 1 döndürüp yer değiştiriyor, azalan(42, 7) 0 döndürüyor. sirala'ya hiç dokunmadan son basamağa göre yeni bir kural ekliyoruz (61 42 3 23 56 7 88 19); kabarcık sıralaması eşitleri takas etmediği için 3 ile 23'ün sırası korunuyor. Son olarak standart kütüphanedeki qsort'un kılavuz sayfasına bakıyoruz: son parametresi int (*compar)(const void *, const void *); void * sayesinde her türden diziyi sıralıyor, kuralı yine biz veriyoruz. Ekrandaki her çıktı, kodun gerçekten derlenip çalıştırılmasından geliyor. Bu derste: 1. Fonksiyonun adı kodunun başladığı adres (lldb) 2. int (*f)(int a, int b) bildirimini okumak; iki çağırma yolu 3. Parantez şart: int *g(int a, int b) bir fonksiyon bildirimi 4. Karşılaştırmayı dışarıdan alan sıralama: artan, azalan, son basamak 5. Standart kütüphanede qsort Bölümler: 0:00 Fonksiyon işaretçileri 0:17 Bir sıralama, üç kural 0:42 Fonksiyonun adı bir adres 1:11 Bildirimi okumak, iki çağırma yolu 1:51 Parantez şart 2:20 sirala: karşılaştırma dışarıdan 2:53 Aynı sirala, iki sıra 3:22 Yeni kural: son basamak 3:58 Standart kütüphane: qsort 4:26 Bugünün dört kuralı 4:51 Sonraki ders: fonksiyon işaretçisi dizileri Kaynak kitap: Paul Deitel, Harvey Deitel — C How to Program, 9. baskı (2022), §7.12.1. 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–#38.

Bu videoyu izlemek için Premium üyelik gerekir.