C Programlama #37 | İşaretçiler ve Diziler

İşaretçiler (Pointers)

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

Aynı elemanı üç farklı biçimde yazdıralım: v[2], *(v + 2) ve tuhaf görünen 2[v]. Üçü de 90 ve ne gcc ne clang uyarıyor. Neden? Otuz yedinci derste işaretçilerle diziler arasındaki yakın ilişkiyi görüyoruz: dizi indisi aslında bir işaretçi işlemi. C için v[i], *(v + i)'nin kısaltmasıdır; toplama değişmeli olduğu için 2[v] de geçerlidir (böyle kod yazmayın, ama C'nin dizileri nasıl gördüğünü gösteriyor). lldb ile bakınca &v[2] ile v + 2 aynı adres: dizinin adı ifadelerde ilk elemanın adresine dönüşür, v + 2 de iki eleman yani 8 bayt ileridedir. Bir elemana dört yoldan ulaşıyoruz: v[i], *(v + i), p[i] ve *(p + i) dört satırda da aynı değeri veriyor. İşaretçi dizinin ortasını da gösterebilir: p = &v[2] iken p[0] 90, p[1] 64, eksi indisle p[-1] 85 ve p[-2] 72; dizinin adıyla v[-1] ise dizinin dışıdır. Kaydırmada parantez şart: *(v + 2) 90 ama *v + 2 = (*v) + 2 = 72 + 2 = 74. Dizinin adı işaretçi gibi davranır ama işaretçi değişkeni değildir: p += 3 sorunsuz, v += 3 gcc ve clang'da derleme hatası; sizeof v 16 (dört int), sizeof p 8 (bir adres). İki yazımı bir metin kopyalama fonksiyonunda yan yana kullanıyoruz (Ada Lovelace) ve gcc -O2 ile ürettirdiğimiz makine kodunda ikisinin birebir aynı olduğunu görüyoruz: tek bir yükleme komutu, i'yi 4 ile çarpıp adrese ekliyor. Ekrandaki her çıktı, kodun gerçekten derlenip çalıştırılmasından geliyor. Bu derste: 1. v[i] = *(v + i): indis, işaretçi aritmetiğinin kısaltması 2. lldb: &v[2] ile v + 2 aynı adres 3. Bir elemana dört yol; dizinin ortasını gösteren işaretçi ve eksi indis 4. Parantez şart: *(v + 2) ile *v + 2 farklı 5. Dizinin adı değiştirilemez; iki yazım aynı makine kodu Bölümler: 0:00 İşaretçiler ve diziler 0:14 v[2], *(v + 2) ve 2[v] 0:54 lldb: aynı adres 1:15 Bir elemana dört yoldan 1:46 Dizinin ortasını gösteren işaretçi 2:26 Parantez şart 2:49 Dizinin adı değiştirilemez 3:22 Metin kopyalamak: indisle ve işaretçiyle 3:55 Hangisi daha hızlı? Aynı makine kodu 4:32 Bugünün dört kuralı 4:58 Sonraki ders: işaretçi dizileri Kaynak kitap: Paul Deitel, Harvey Deitel — C How to Program, 9. baskı (2022), §7.9. 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–#36.

Bu videoyu izlemek için Premium üyelik gerekir.