Merhaba, tekrar hoş geldiniz. İşaretçileri biraz daha ayrıntılı olarak anladığımıza göre,
karakter işaretçilerinden, özellikle de karakter işaretçilerini
dizeleri temsil etmek için nasıl kullanabileceğinizden bahsetmek istiyorum.
Dizeler karakter dizileri, çoklu karakterler, kelimelerdir.
Artık dizilerin işaretçi aritmetiği kavramında işaretçilerle nasıl ilişkili olduğunu biliyoruz.
Çok, çok faydalı bir konsept.
Bu kavramlar karakter dizilerine uygulandığında çok
yararlı olabilir, çünkü artık bir dizeyi karakter karakter kolayca geçebiliriz.
Bir diziye işaretçi kullanmanın en yaygın uygulamalarından biri, bir karakter
dizisine işaretçi olarak kullanmaktır.
Bunun sebepleri notasyonel kolaylık ve verimliliktir.
Bu nedenle, bir dizeye başvurmak için pointer to char türünde bir değişken
kullanmak size çok fazla esneklik sağlar.
Bu nedenle, karakter dizileri üzerinde karakter
işaretçilerini olabildiğince çok kullanmaya çalışacaksınız,
özellikle de bir işleve veri aktarmak için karakter işaretçilerini kullanacaksınız.
Bunun gibi her türlü güzel şey.
Şimdi bir dizeyi kopyalamak için dizi kullanan bir örneğe bakalım.
Bu örnekte, dizi parametremiz bir karakter dizisi olacaktır.
Bunu doğrudan fonksiyon bildiriminde göreceksiniz.
Bunu bir karakter işaretçisi alan bir işlevle karşılaştırmak ve karakter
işaretçisi işlevinin nasıl çok daha verimli olduğunu göstermek istiyorum.
Bu örnekte, biri dizi alan diğeri
de işaretçi alan iki fonksiyonumuz
var.
İlk fonksiyon kopyalama dizesinde, bir
for döngüsü kullanarak tüm dizinin içinden geçebiliriz I alt I'den sıfıra eşittir
ve null karakter dizesini görene kadar tüm yolu gideriz ve sonra döngü
kontrol değişkenimizi artırırız.
Ve sonra tek yapmanız gereken 2 alt I eşittir alt I demek. Orada doğrudan bir görev
yapıyoruz.
Ve en sonunda, null karakterini görene kadar tüm yolu gittikten
sonra, to dizimizin sonuna bir null karakteri ekliyoruz,
oldukça basit. Şimdi işaretçileri kullandığımızda bunu nasıl yaptığımızı görelim.
İlk olarak, pointer'lara sadece char star to char start from diyerek kopyalama
dizesinde fonksiyon bildirimi olarak bildiririz.
For döngümüzde, aslında herhangi bir değişken bildirmek
zorunda değiliz çünkü işaretçilerimiz var ve sadece from
null sonlandırıcıya ulaşana kadar yinelemek istiyoruz.
Ve sonra hem from hem de to işaretçilerini artırabiliriz.
Çünkü burada nokta aritmetiği yapıyoruz.
Biz sadece işaretçiye bir ekliyoruz, bu da adresini bir artırıyor, bu da bir sonraki
karakteri alıyor.
Ve bir sonraki for döngü satırında hem to hem de
from işaretçisini kaldırıyoruz çünkü işaretçinin
işaret ettiği gerçek değeri, gerçek karakteri to işaretçisine
atamak istiyoruz.
Ve en sonunda, to işaretçisinin işaret
ettiği yere null karakterini ekleriz, bu da from
için dizenin son adresinin sonunda olur, ancak şimdi to adresine
işaret eder.
O kadar da kötü görünmüyor. Yani bir for döngüsü var.
Temelde aynı miktarda kod satırına sahipsiniz.
Ama sözdizimindeki farkı görüyorsunuz.
Alt simge kullanmıyorsunuz ve işaretçi kullanıyorsunuz, yıldız işaretini kullanın.
Yine, gerçekten bir notasyonel kolaylık meselesi.
Burada büyük bir avantaj göremiyorsunuz.
Ancak işaretçileri kullandığınızda daha az koda inmek
için bunu daha fazla optimize edebilirsiniz.
Dolayısıyla, işaretçi olarak bir char diziniz
varsa, text adında bir karakter diziniz varsa, benzer şekilde buna bir işaretçi
tanımlayabilir ve text içindeki öğeleri kullanabilirsiniz.
Yani burada char yıldız metin işaretçisi diyebiliriz,
bir karakter işaretçisini bu şekilde tanımlarsınız.
Metin işaretçisi metin adı verilen karakter dizisinin başlangıcını
gösterecek şekilde ayarlanmışsa, bu ön ve
son uygulama ve azaltma operatörlerini kullanarak onu bir artırabilirsiniz.
Dolayısıyla, yukarıdaki artı artı metin işaretçisi, metin işaretçisini metindeki bir sonraki
karaktere, yani metin alt 1'e işaret edecek şekilde ayarlayacaktır.
Yani tamsayılarda olduğu gibi bir sonraki ışına bakmak istersek, tek
yapmamız gereken 1 ile 2'yi toplamaktır ve bir sonraki karakteri elde edebiliriz.
Karakter dizilerinde çok daha kullanışlıdır
çünkü karakterleri tek tek kolayca değiştirebilirsiniz.
Azaltma operatörü olan eksi eksi metin işaretçisi yaparsanız, metin işaretçisinin
metnin başlangıcını göstermediğini varsayarak işaretçiyi
metindeki önceki karaktere ayarlayacaktır.
Çünkü öyle olsaydı, bu sınır altı hataları olurdu.
Eğer dizenin sonuna artı ekliyor olsaydı, sınır dışı hatası alırdınız.
Tıpkı bir tamsayı aritmetiğinde olduğu gibi, bir dizinin sınırlarını aşmamak için her zaman dikkatli olmalısınız.
Ancak çok basittir, tamsayı işaretçi aritmetiği yaptığınızda çok yakından
ilişkilidir.
Karakter işaretçisi aritmetiği de aynı şeydir.
Bu daha da kullanışlı çünkü artık alt simge kullanmadan tek tek karakterlere bakabilirsiniz.
Dolayısıyla, önceki örneğe bakarsak
ve aslında daha az kod satırı yapmak için işaretçileri kullanarak bunu
biraz daha optimize edebiliriz.
Şimdi kopyalama dizemizde, bu işlev bildirimini öncekiyle aynı şekilde yapıyoruz, yıldız işaretini
kullanarak birkaç işaretçi oluşturuyoruz.
Ancak artık bir for döngüsü kullanmıyoruz çünkü önceki örnekte
for döngüsü kullanmak anlamsızdı çünkü
döngü kontrol değişkenini başlatmamız gerekmiyordu.
Tek yapmamız gereken bir koşulda bir döngüden çıkmaktı
ve sonra aslında for döngüsünde artırma ve azaltma operatörlerini kullanıyoruz,
ancak bunu yapmamıza bile gerek yok.
Aslında burada durum çok daha basit hale geliyor çünkü bir while döngüsü kullanırsak,
tek yapmamız gereken while döngüsüne bakmaktır ve null karakteri
aslında sıfıra eşit olduğu için null karakteri işaret ediyorsa atlayacaktır.
Ve while döngüsü, c'deki Boolean'ların tam sayılarla
temsil edildiğini unutmayın, bir doğrudur ve sonra sıfır yanlıştır
veya gerçekten sıfır yanlıştır ve sonra başka herhangi bir şey doğrudur.
Bu durumda, yanlış olan null karakter 0, dışarı atlayacaktır.
Yani while döngüsündeki çıkış koşulu için yapmanız gereken tek şey bir yıldız işareti koymaktır.
Bu karakterin değerinin ne olduğunu görmek için dereferanslama yapan şey nedir?
Böylece kopyalamak istediğimiz dizenin sonuna geldiğimizde dışarı atlarız.
Aksi takdirde, işaretçilerimizin modifikasyonunu
tam oraya koyarız, artı artıdan iki artı artı.
Şimdi bu bir artış sonrası operatörüdür.
Yani bunun anlamı, artı artı değişkenin sağ tarafındadır.
Ve bunu yaptığınızda, ifade bitene kadar
ona bir tane eklemediğiniz anlamına gelir.
Yani bunun yapacağı şey, yıldız 2'nin başlangıç noktasına eşit olduğunu söylemek olacak.
Ve bu ifade tamamlandıktan sonra, 2 1'e eklenecek ve 1'den eklenecek.
Değişken adından önce artı işareti koysaydınız,
bu deyimi çalıştırmadan önce değişkene ekleme yapacaktı ve bu
bir sorun olacaktı çünkü dizede kopyalanan ilk öğeyi kaçıracaktık.
Ancak daha fazla kod satırına ihtiyacımız yok. Aynı deyim içinde gerçek bir artış
işaretçisi aritmetiği ve atama yapıyoruz, böylece
kodu bir azaltıyoruz.
Yine, gösterim çok basittir.
Bir tamsayı aritmetik ödevini çok kolay bir şekilde yapıyoruz.
Ve sonunda, işimiz bittikten sonra, tüm dizeleri kopyaladıktan
sonra, null karakterini işaretçiye ekleriz
ve bu işaretçinin referansını kaldırırız çünkü iki karakter aslında döngüden geçmesinin
nedeni son karaktere işaret ediyor olacaktır.
Bu yüzden burası biraz temizlendi.
Size işaretçilerin gücünü ve işaretçilerle aritmetiği
aynı satırlarda nasıl kullanabileceğinizi gösterir ve bu artırma
ve azaltma operatörleriyle, bu artı artı ve eksi eksilerle, bunu daha da hızlı
ve kolay hale getirir, böylece daha verimli de olur.
Eğer bu dize kopyalama fonksiyonlarını kullanmak isteseydik, sadece iki karakter dizisi oluşturabilirdik.
Karakter dizilerini doğrudan kopyalama dizesine aktarabiliriz çünkü 0 karakter dizileri
işaretçidir.
Bunlar işaretçilerdir, bu yüzden onları gerçekten referans dışı bırakmamız
veya adres ya da başka bir şey eklememiz gerekmez. Sadece string2, string1 diyebiliriz.
Ve bunun yapacağı şey, string2 karakter dizisine
kopyalanacak bir dizeyi kopyalamak ve ardından printf
kullanarak yazdırmaktır.
Karakter dizileri yerine karakter işaretçilerini nasıl kullanabileceğinizi
ve neden bazen tercih edildiklerini gösteren bir örnek üzerinden gitmek istedim.
Bunun bazen programcı tercihi olduğundan bahsetmiştik, Fortran
gibi önceki dillerde programlama yaptıysanız, yükseltmeye
alışkın olabilirsiniz. Ama eğer varsa, işaretçi kullanmanın
faydalarını göreceksiniz.
Umarım yardımcı olmuştur. Teşekkür ederim.