Merhaba, tekrar hoş geldiniz.
Nokta aritmetiği anlaşılması ve kavranması zor bir kavram olduğu
için, bu kavramı gerçekten gösteren son
bir örnek üzerinden gitmek istedim, iyi bir iş çıkarıyor.
Ve bu örneği anlarsanız, nokta aritmetiği ile
ilgili hiçbir sorun yaşamayacaksınız.
Size göstermek istediğim ilk örnek, bir işaretçiye
bir tamsayı değeri eklemenin etkisidir.
Dolayısıyla, toplama işlemiyle işaretçi aritmetiği yaptığımızda,
aslında adresler açısından nasıl çalıştığını görebiliriz.
Bu programda tek yaptığım bir karakter dizisi oluşturmak,
buna string deniyor.
Ve sonra p adında bir karakter işaretçisi oluşturuyorum.
Birden fazla olan ipin tüm uzunluğunu gözden geçiriyorum.
Bu yüzden tüm diziyi gözden geçiriyorum.
Sadece çoklu boyut ve çoklu ilmek gücü uzunluğu için temel adı verin.
Ve sonra bu dizinin içindeki her bir gerçek
dizeyi veya karakteri yazdırıyorum.
Ve ayrıca yaptığım şey, adresi ve ardından
eklediğim gerçek
numarayla birlikte adresi görüntülemek.
Şimdi bunun sadece çıktısına bakalım çünkü çıktı, nokta aritmetiğinin
gerçekten iyi bir örneğini gösteriyor.
Şimdi kod bloklarına gidelim ve bunu çalıştıralım.
İşte kod bloklarına geldik. Kodu biraz temizledim.
Ben str length kullanıyorum, ekstra include olduğu için bir strn length ayarladım.
Ve ben sadece bunu çalıştırmak istiyorum.
Bunu çalıştırdığımda fark edeceğiniz şey, belleğin nasıl
göründüğünü hatırladığınızı ve nokta aritmetiği yapan değerleri
göstermesidir. Yani multiple sub-0 diyorsanız, unutmayın,
multiple sadece bir dize içerir.
Ancak buna bakarsak ve dizi içeriğine bakın
dersek, 0'ın katları a, 1'in katları boşluk ve geri kalanı dizedir.
Bu dizi.
Bunun hemen yanında, işaretçiye 0 eklemek ve referansını
kaldırmak, 1 eklemek ve 2 eklemekle aynıdır.
Ve size işaretçinin kendisine referans verip ona sayılar ekleyerek işaretçi
aritmetiğini nasıl yapabileceğinizi gösterir.
Yani g aldığınız işaretçi artı yedi dereferanslama.
Üçüncü sütunda ise, arttıkça gerçek adresleri
gösteriyorum. Böylece, karakter dizisinde sadece
ve işaretini kullanarak dizideki her bir elemanın adresini,
0. eleman için 060feff adresini görürüz ve bu böyle devam eder.
Ve sonra adreslere bakarız, eğer işaretçiyi dereferans
yapmadan sadece kendisine eklersek, adreslerin aynı hizada
olduğunu göreceksiniz.
Burada neler olup bittiğini görmek için sözdizimine baktığımızda, aslında
gösterdiğimiz ilk şeyin bir sayaç olan dizideki indeks olduğunu görürüz.
Ve sonra dizideki karakter olan yüzde c'yi
görüntüleriz.
Görüntülediğimiz bir sonraki şey, işaretçi
artı I'yi dereferanslamaktır.
Yani burada yaptığımız şey, I'yı görüntülemek ve ardından
işaretçinin dereferansını artı I'yı, gerçek değeri görüntülemektir.
Böylece d olarak
sadece gerçek sayacı
gösteriyoruz ve c noktası da bizim dereferansımız
oluyor. Yani p bizim işaretçimiz.
Sadece p artı I diyoruz, işaretçi aritmetiği, ve sonra onu dereferanslıyoruz.
Ve sonra adresleri almak için, dizi
adresini almak için tek yapmamız gereken ampersand
multiple ve ardından index demek.
Burada ilk olarak işaretçinin adresini almak için sadece
p artı I deriz,
asıl sayacı almak için ise p'yi
nasıl artırdığımızı gösteririz, sadece
p artı yüzde d yaparız.
Ancak, adreslere işaret ettiğimiz
belleğin aslında nasıl gösterildiğini ve bunların
bir dizideki farklı indekslere
ve gerçek işaretçilere nasıl eşdeğer
olduğunu göstermek için iyi bir iş çıkarıyor.
Bunun iyi bir iş çıkardığını düşünüyorum.
Uzunlarla işaretçi aritmetiği konusunda iyi bir iş çıkaran
bir örneğe daha bakmak istiyorum. Çünkü burada bunlar
tam sayılardır. Bu yüzden tek yapmamız gereken bir tane eklemek
ve otomatik olarak bir sonraki bayta kadar gitmektir. Ne yaptığımıza bakalım, uzun vadeli işler yapıyoruz.
Bu örnekte, aynı şeyi bir long ve bir long pointer ile nasıl yapabileceğinizi
de göstermek istedim.
Karakter işaretçisi ile, sadece bir dize karakter dizisiydi.
Ancak farklı boyutlardaki uzun diziler için bile, bir işaretçi
kullanarak bunları yineleyebiliriz ve bayt sayısının
gerçekte nasıl değiştiğini görebilirsiniz.
Yani bir long pointer'ımız olduğunu ve ona bir eklediğimizi söylesek de aslında ona
4 byte ekliyoruz çünkü long biraz daha büyüktür ve bunu bu örnekte göreceğiz.
Şimdi bu örneği kod blokları halinde çalıştıralım.
İşte örneğimiz. Yine bir tamsayı sayacımız, bir döngü sayacımız var.
15l'lik uzun bir dizimiz var.
Son eki koyarak l'yi belirtiyoruz, sonra l'lerini belirtiyoruz, uzunlarını
belirtiyoruz, birden fazlasını gösteren bir uzun işaretçimiz var.
Yine, bir dizi olduğu için address of operatörünü kullanmak zorunda değiliz.
Uzun bir süre boyunca devam edeceğiz. Burada stir length kullanamayız, size of kullanmamız
gerekir ve aslında bunu dizideki her noktaya bölmemiz gerekir.
Yani toplam boyutun dizideki tek bir noktaya bölünmesi,
işte o zaman atlamak istiyoruz çünkü
bunlar her biri 4 bayt artan adreslerimizi hatırlıyor.
Ve yine burada yaptığımız şey, hem işaretçiyi hem de diziyi
görüntülemek ve bunların nasıl ilişkili olduğunu
göstermek ve ardından uzun olanın sistemimizdeki
gerçek toplam bayt sayısını görüntülemektir.
Bu da yine dizilerin işaretçilerle nasıl ilişkili olduğunu
göstermektedir.
Yani bunu çalıştırırsak
benzer bir çıktı göreceğiz. Ancak burada biraz farklı olan şey,
adres boyutunun 4 bayt artmasıdır. Bu yüzden adresi ve işaretçiyi yazdıracağız.
Yani adres ve işaretçi artı 0 için,
bu 6356728 adresi olan dizi
alt 0'a eşit olacaktır.
Ve işaretçinin referansını kaldırmak için 15 değerini alırız.
Yani p artı 0 hala dizi alt 0'a eşit olacaktır.
Ve sonra yine aynı şeyi p artı bir p artı 2 ve p artı 3 için yaparız,
hepsi dizideki indeks için doğru noktalara eşdeğerdir.
Adresler 4 bayt artıyor, ancak yine de bir 2 ve 3 ekleyebiliyoruz ve değerlerin
aynı olduğunu görüyoruz.
Ve sonra bize bu uzunluğun 4 bayt kapladığını ve bu yüzden adreslerin 4 arttığını söyler.
Burada önemli olan, buna hala bir tane ekleyebilmemiz ve derleyicinin
bir sonraki adrese gideceğini bilmesidir.
Dolayısıyla, ister uzun ister karakter ya da sistemin
içindeki belirli veri türü ne olursa olsun, bir ya da
2 eklemek doğru sayıda bayt ekleyecektir.
Size göstermek istediğim bir başka güzel örnek
de bu işaretçi aritmetiğinin gerçekten önemli olması ve bir diziyi yinelerken
ya da içinde dolaşırken gerçekten yararlı
olması, çok daha temiz ve çok daha verimli olmasını sağlamasıdır.
Umarım bu yardımcı olmuştur. Teşekkür ederim.