C Programlama #32 | Adres İşleci & ve Dolaylama İşleci *

İşaretçiler (Pointers)

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

Bir değişkeni, adını hiç yazmadan değiştirebilir miyiz? Otuz ikinci derste işaretçilerin iki temel işlecini yakından tanıyoruz: adresi veren & ve bir adresten o adresteki değişkene ulaştıran *. Programda not 85; ortadaki satırda not'un adı geçmiyor (*p = 90), ama çalıştırınca not 90 oluyor: p onun adresini tutuyor ve *p, o adresteki değişkenin kendisi. & tek işlenenli bir işleçtir ve işleneninin adresini verir; işleneni bellekte yeri olan bir değişken olmalıdır: &27 ve &(not + 1) için gcc 'lvalue required as unary & operand', clang 'cannot take the address of an rvalue' diyor; sol değer (lvalue) ile sağ değer (rvalue) farkını açıklıyoruz. * ters yönde çalışır: adresten o adresteki değere gider (dolaylama). *p 85, *p * 2 ise 85 · 2 = 170; aynı programda yıldızın üç görevi var: tanımda işaretçi, ifadede dolaylama, iki değer arasında çarpma. lldb ile *p = 90 satırından önce ve sonra belleğe bakıyoruz: not 85'ten 90'a çıkıyor, adresi aynı; p hiç değişmiyor, değişen p'nin gösterdiği yer. &*p ve *&p yine p'yi veriyor, *&not 85: & ile * birbirinin tersi. İşaretçinin asıl gücü, hangi değişkeni göstereceğinin çalışırken seçilebilmesi: en düşük nota 5 puan ekleyen programda hedef işaretçisi önce a'yı, sonra 55 70'ten küçük olduğu için b'yi gösteriyor; b 55 + 5 = 60 oluyor (çıktı 70 60 82). İşlem önceliği: (*p)++ not'u 86'ya çıkarıyor; *p++ ise p'nin kendisini artırıyor (gcc uyarıyor, p 4 bayt ileri kayıyor, not 86 kalıyor). Son olarak tehlikeler: NULL bir işaretçiden okumak programı çökertiyor (Segmentation fault: 11, çıkış kodu 139 = 128 + 11), ilk değer verilmemiş bir işaretçiyle yazmak bu Mac'te Bus error: 10 veriyor (138 = 128 + 10); çöp adres yazılabilir bir yeri gösterseydi başka bir veri sessizce bozulabilirdi. Ekrandaki her çıktı, kodun gerçekten derlenip çalıştırılmasından geliyor. Bu derste: 1. & ile adres, * ile o adresteki değişken: adını yazmadan değiştirmek 2. & yalnız bellekte yeri olan bir değişkene uygulanır: sol değer ve sağ değer 3. * ile okumak ve yazmak; lldb ile önce ve sonra bellek 4. & ile * birbirinin tersi; işaretçiyi çalışırken başka bir değişkene yöneltmek 5. Öncelik: (*p)++ ile *p++; NULL ve ilk değersiz işaretçinin tehlikesi Bölümler: 0:00 & ve * işleçleri 0:19 Adını yazmadan değiştirmek 0:43 & yalnız bir değişkene uygulanır 1:19 * ile okumak: dolaylama 1:55 * ile yazmak 2:22 & ile * birbirinin tersi 2:50 İşaretçiyi çalışırken yöneltmek 3:34 İşlem önceliği 4:12 Yıldızdan önce: gerçekten bir değişken mi? 4:53 Bugünün dört kuralı 5:22 Sonraki ders: başvuruyla geçirme Kaynak kitap: Paul Deitel, Harvey Deitel — C How to Program, 9. baskı (2022), §7.3. 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–#31.

Bu videoyu izlemek için Premium üyelik gerekir.