Merhaba ve tekrar hoş geldiniz
Bu derste, işaretçi aritmetiği ve sabit değiştiriciyi kullanma
konusundaki zorluğumuzun bir gösterimini yapmak istiyorum.
Kod bloklarını gündeme getirelim. Yeni bir proje oluşturacağım. Bu örneğe işaretçi aritmetiği
adını vereceğiz.
Burada yapacağımız şey, nokta aritmetiği
kullanarak bir dizenin uzunluğunu belirlemektir.
Bu yüzden yapmak istediğim ilk şey fonksiyon bildirimimi oluşturmak.
Bu, dizenin uzunluğunu döndürecektir. Bu yüzden dönüş türü olarak
int olacaktır. Buna dize uzunluğu diyeceğim ve
bu sadece bir işaretçi alacak, ancak sabit bir işaretçi olacak.
İşaret edilen şeyin değerini değiştirmek istemiyoruz.
Bu da ilk anahtar sözcük olarak sabiti kullanacağımız ve ardından bir
karakter olan türü belirteceğimiz anlamına gelir.
Yıldız deriz ve ona istediğimiz ismi verebiliriz.
Tekrarlamak gerekirse, bunun yerine buraya sabit koysaydık, bu, işaretçinin
adresinin, işaretçinin değerinin değişemeyeceğini
söyleyecekti.
Ancak yine de, bu biraz gereksizdir ve gerçekten yapılması gerekmez
çünkü değerden değere geçiş kopyalama yapıyoruz.
Yani zaten adresin bir kopyasına sahipsiniz, bu yüzden orada değiştirseniz de fark etmez.
Ancak işaret ettiğiniz şeyi değiştirmek önemlidir. İşaret ettiğiniz şeyin değerinin değişmesini
istemiyorsanız, kesinlikle burada sürekli yapmak istersiniz ve bu önemlidir.
Şimdi tek yapmamız gereken ana sayfamızı oluşturmak.
ana merkezimizi oluşturun. Ana sayfamızda yapacağımız tek
şey, farklı dizelerle bir dize uzunluğu
işlevi olan dize uzunluğunu çağırmaktır.
Şimdi yazdıralım ve hatırlayın, bir tamsayı döndürür, böylece yüzde d diyebiliriz ve sadece
geçirdiğimiz birkaç dizenin uzunluğunu yazdıracağız.
Dize uzunluğunu çağıracağız ve bazı sabit
dizeleri aktaracağız, böylece her şeyi burada çift tırnak
içine alabiliriz. İşaretçi oluşturmamıza bile gerek yok.
Bir işaretçi oluşturup atayabilir ve sonra içeri aktarabilirsiniz, ancak
bunun bir sabit olduğundan emin olmanız gerekir.
Ancak daha az kodla daha kolay olduğu için, sadece dize uzunluğu testi diyebiliriz.
Yine, bu sabit bir gerçek dizedir.
Biraz daha test edeceğiz.
Ondan sonra bir boşluk bırakacağız. Biraz satır beslemesi ekleyelim.
Burada dize uzunluğu diyeceğiz. Ve aslında boş dize ile çağıralım, sıfıra
çevirdiğimizden emin olalım. Ve sonra üçüncüsüne
dize uzunluğu diyeceğiz, sadece jason
diyeceğiz.
Bu arada, bunları oluşturduğunuzda ve bu dize uzunluğu bağlantılarını ilettiğinizde,
bunlara otomatik olarak null sonlandırıcı eklenir.
Bunu işaretçileri bildirdiğimizde öğreniriz.
Avantajlarından biri de bu. Bir işaretçi oluşturacaksanız ve bu bir değişmez
olacaksa, boyutu belirtmek istemezsiniz.
Eğer bir dizi ise karakter gibi bir şey yapmak istersiniz
çünkü dizi bir işaretçidir. Ancak boyutu belirtmek
istemezsek, karakter p diyebilir
ve sonra burada sadece jason diyebiliriz.
Karakter dizileri için boyut belirtmezsek, otomatik olarak bir null sonlandırıcı
ekleyeceği ve boyutu sizin için oluşturacağı dersi hatırlayın.
Bu şekilde hata yapmazsınız. Boyutu dizinin içine koyarsanız, null sonlandırıcıya
yeterince sahip olmayabilirsiniz.
Değişmezi dize uzunluğuna geçirdiğimizde de aynı şey olur,
null sonlandırıcı sonuna eklenir.
Dolayısıyla, bu değişkenleri başlangıçta
oluşturabilir ve buna benzer bir şey yapabilir ve ardından
her birini geçirebilirdik.
Ancak değişkenler yaratarak zaman kaybetmek istemedim. Ben de bunu yapacağım.
Şimdi bu kod için gerçekten önemli olan şey işlevdir.
Bu yüzden dize uzunluğumuzu oluşturacağız. Tekrar hatırlayın, bir tamsayı döndürür
ve bu bir sabit olacaktır. Bu yüzden sadece sabit char yıldız dizisi diyebiliriz.
Ayrıca, işlev bildirimi değişken adının eşleşmesi
gerekmediğini de fark etmişsinizdir. Bunu dizeler olarak da koyabilirim ve bu da iyidir.
Şimdi bu fonksiyonun içinde bir yerel işaretçi oluşturmamız gerekiyor çünkü yerel
işaretçi dizenin sonunu gösterecek. Dizenin sonunun adresini bulduktan
sonra, dizenin başının adresini eksiltebiliriz.
Dizenin başlangıcı için adres, içeri aktarılan şeydir.
String otomatik olarak dizideki ilk elemana veya dizinin ilk adresine
işaret edecektir.
Yani eğer bir yerel işaretçi yaratırsak ve
yine başka bir sabit char yıldız yaratmak istersek
ve sadece son adresi söylersek nasıl olur?
Ve bu, dizenin başlangıç adresine eşit olacak ve daha sonra döngümüzde
her seferinde bunu artıracağız.
Şimdi son adresimiz var. Yine bu, null sonlandırıcıdan hemen
önceki adresi saklayacak olan yerel bir değişkendir.
Şimdi while döngümüzü yazabiliriz.
Ve while döngümüz null sonlandırıcıyı gördüğümüzde çıkacaktır.
Şimdi bunu iki farklı şekilde yapabiliriz.
Karakterleri karşılaştırabiliriz. Bu nedenle, yıldızın son adresi gibi
bir şey söyleyebiliriz, çünkü referansını kaldırmamız gerekir,
ters eğik çizgi sıfıra eşit değildir,
bunun gibi bir şey yapabiliriz, ancak bu çok fazla
kod gerektirir. Gerçekten yapmamız gereken
tek şey, son adreste
yıldız varken demek. Çünkü bir null sonlandırıcıyı
dereference ederseniz, sıfıra eşit olacaktır
ve sıfır da false'a eşittir.
Boolean'ların bir doğru sıfır yanlış olduğunu biliyoruz.
Yani eğer yanlışsa, ortaya çıkacaktır. Yani tek yapmanız gereken while
koşulunuzun içine yıldızın son adresini koymaktır.
Yine, bu işaretçinin referansını kaldıracaktır.
Ve son adresi gösterdiğinde, null sonlandırıcıyı gösterecektir.
Şimdi son adresi değiştirdiğimizden emin olmalıyız, böylece sonunda null sonlandırıcıyı işaret eder.
Burada yapabileceğimiz tek şey artı artı son adres diyebiliriz.
Yani bu while döngüsünün her yinelemesi, bir sıfır görene kadar
adresi artıracaktır.
Sıfır, boş sonlandırıcıyı temsil eder.
Dolayısıyla, bu while döngüsünün yürütülmesi tamamlandıktan
sonra, son adres null sonlandırıcının adresine işaret edecektir.
Daha sonra null terminatörün adresini, string'imize aktarılan
adresten çıkarabiliriz ve bu bize uzunluğumuzu verecektir.
Bir sonraki satırda yapmamız gereken tek şey bu. Sadece son adresimizi döndür diyebiliriz
ve aslında adresi eksiltmek istiyoruz,
bu nedenle herhangi bir şeye referans
vermemize veya dolaylama operatörünü kullanmamıza gerek yok,
son adres eksi dize. Yani dize içeri aktarılır,
onu hiç değiştirmeyiz.
Bu ilk karakteri işaret ediyor. Bu J'yi işaret ediyor.
Bu adres olacaktır ya da sekizinci satırda ilk kez çağırdığımızda, bu s'nin adresi olacaktır.
Son adres, bu son t'nin adresine işaret ediyor olacak.
Aslında bundan bir tane daha var, null terminator. Eğer son adres eksi s'nin adresi
dersek, bize uzunluğu verecektir.
Ve biz de bunu geri getireceğiz.
Umarım bu mantıklıdır.
Yine 17. satırda bir yerel değişken yaratıyoruz çünkü
son adresi, yani null terminatörün adresini takip etmemiz
gerekiyor.
Bu while döngüsünün çalışması bittikten sonra, son adres t'den sonrasını, null
sonlandırıcıyı gösterecektir.
O zaman son adresi dizeden çıkarabiliriz, dizenin adresi
geldiğinde s'ye işaret eder, bunu değiştirmeyiz.
Bakalım bu bize doğru uzunluğu geri verecek mi?
Bunu çalıştırdığımızda, içeri aktardığımız dizelerin uzunluğunu görmeliyiz.
Yani 17 0 ve 5'i görüyoruz.
Bakalım 1 2 3 4 5 6 7 8 9 10 11 12 13, boşluğu
saymanız gerekiyor, 14 15 16
17. Doğru, boş olan çift
tırnak içine koyduk, bu yüzden sıfır olmalı ve
sonra Jason 5 olmalı, yani 17 0 ve 5, bu doğru.
Burada yaptığımız şey, son adresi artı artı artırma
operatörünü elde etmek için işaretçi aritmetiğini kullanmak
ve ardından son adresi eksi dizeyi eksilterek
uzunluğu elde etmek için aritmetiğimizi işaret etmekti.
Çok güzel. Nokta aritmetiğinin gücünü, notasyonel
kolaylığını göstermeye çalışıyorum.
Bir karakter dizisindeki çeşitli noktalara ulaşmak
ve karakterleri çıkarmak için nasıl kolayca artırma,
azaltma yapabilirsiniz. Bu durumda, sadece adresleri alıyoruz ve daha sonra uzunluğu elde etmek
için adresleri birbirlerinden eksiltmek için kullanıyoruz.
Umarım bu yardımcı olmuştur. Az önce bahsettiğim her şeyi anladığınızdan emin olun.
Yine, sabit kavramı, artı artı kavramı, bir adrese atıfta bulunursanız
ve bu bir null sonlandırıcıya işaret ediyorsa,
sıfırdır, bu yüzden dışarı atlar ve sonra bu iki adresi küçültme
kavramı. Teşekkür ederim.