Merhaba, tekrar hoş geldiniz. Bu derste, bir önceki zorluğumuz olan referansla
geçişi anlamak, bir fonksiyonun içindeki
bir parametrenin bir işaretçi almasını
sağlamak için bir gösteri sunmak istiyorum.
Öyleyse yeni bir proje oluşturalım. Buna referansla geçen bir
işaretçi diyeceğiz çünkü gösterdiği şey bu, burada
temel şeyler, yeni proje, konsol
uygulaması c. Burası oldukça açık.
Bu işaretçiye referans olarak alt çizgi
geçişi diyelim.
Yine, veri aktarmak için bir fonksiyonun içinde parametreleri nasıl kullanabileceğimizi
ve bu verilerin daha sonra fonksiyonun dışında nasıl değiştirileceğini
gösteriyoruz.
Bu yüzden yapacağımız ilk şey fonksiyon bildirimimizi, fonksiyon prototipimizi
oluşturmak olacak. Bunu yapmak her zaman güzeldir, böylece
programınızda herhangi bir yeri çağırabilirsiniz. Buna kare diyeceğiz.
Bu fonksiyon bildirimindeki ana şey, bir işaretçi alacak olmasıdır.
Bu yüzden sadece bir son işaretçi alacak, bu yüzden sadece int star diyeceğiz
ve sonra ona istediğiniz ismi verebilirsiniz ve noktalı virgülle bitirirsiniz.
Ana fonksiyonumuzda ilk
olarak normal bir tamsayı değişkeni oluşturacağız
ve int num diyeceğiz ve bunu 9 olarak kodlayacağız.
Ve yapacağımız şey kare fonksiyonumuzu çağırmak olacak.
Kare fonksiyonumuz herhangi bir veri döndürmeyecek, geçersiz olacaktır.
Ancak şimdi ona bir adres iletmemiz gerekiyor çünkü 4. satırdaki kare fonksiyonumuz bir işaretçi alıyor.
Yani bir num geçemeyiz, aslında num'un adresini geçmemiz gerekir ve
sonra noktalı virgülle bitiririz. Bu yüzden fonksiyon adını kullanarak
fonksiyonu çağırıyoruz ve ardından değişkenin adresini geçiyoruz.
Çünkü burada sekizinci satırdaki değişken bir işaretçi değildir.
O zaman temel olarak num değerini yazdırabiliriz.
Ve yine burada fark edeceğiniz şey, adresi aktardığımız için,
bu değişken için fonksiyonun içindeki verileri değiştirirsek, fonksiyonun
dışında da değişecektir. Burada verilen sayının karesi
diyeceğiz ve sadece yüzde d diyeceğiz, bir satır beslemesi
ekleyeceğiz ve sadece num yazdıracağız
ve num 9 olmayacak.
O kadarını söyleyeyim.
Ve sonra normal fonksiyonumuz için sadece 0 döndürürüz.
Şimdi fonksiyonu gerçekten uygulamamız, tanımlamamız gerekiyor.
Bunu tanımlamak için sadece boş kare diyeceğim.
Bir tamsayı işaretçisi aldığını biliyoruz, bu yüzden int star x diyeceğim.
Şimdi de bunu kendisiyle çarpmak istiyoruz.
Ancak adresi değiştirmediğimizden emin olmak istiyoruz.
Burada yapabileceğimiz şey, bunu bir sabit yapmaktır, ancak
veri türünden sonra sabiti koymak istersiniz
çünkü x'in değerini veya işaret ettiği şeyin adresini
değiştirmek istemeyiz, bu yüzden int sabiti diyebiliriz.
Eğer x'in değerini değiştirmek istemeseydik,
sabit derdik. Ancak x'in değerini değiştirmek istiyoruz, onu kendisiyle kare yapacağız.
Yani kendi içinde karesini almak için, öncelikle değiştirmek
istediğimiz şey x'in nihai değeridir. Bu yüzden dolaylama operatörünü
kullanmak zorundayız. Yıldız işaretiyle referansını kaldırmamız gerekiyor.
Ve sonra sadece eşittir diyeceğiz, x çarpı x yapmak
istemiyoruz çünkü bu sadece adresleri çarpacak. X bir işaretçidir, sadece x'in değerini almak istemiyoruz,
x'in işaret ettiği şeyin değerini almak istiyoruz.
Bu yüzden tekrar, referansı kaldırmamız gerekiyor
ve sonra onu kendisiyle çarpacağız. İki kez referans dışı bırakacağız.
Burada ne olup bittiğinin kolayca
anlaşılabilmesi için bunu parantez içine almak iyi bir fikir olabilir.
İşaretçinin referansını kaldırıyor, değerini alıyor ve sonra
değeriyle çarpıyorsunuz ve sonra sadece noktalı virgül ekliyorsunuz
ve yapmanız gereken tek şey bu. Bu programı çalıştırdığımızda 81 çıktısı
alacağız.
Num değerini yazdıracak. Num kare içinde değişecek çünkü
adresi oraya aktarıyoruz.
İşaretçinin değerini gerçekten değiştiremiyoruz,
bu nedenle türden sonra sabitimiz var.
Yani burada build diyoruz ve beyanı değiştirmemişiz
gibi görünüyor.
Şimdi de diğer her şeyin doğru olduğundan
emin olmak istiyoruz.
İşaretçinin sabit olmasını istiyorsanız, yıldız
işaretinden sonra koymanız gerekir.
Yani int başlangıç sabiti, num'un
adresi olan x'in değerini değiştiremeyeceğiniz
anlamına gelir.
Eğer const kelimesini int kelimesinden önce ya da
input kelimesinden sonra yıldız işaretinden önce koyarsak,
bu işaretçinin işaret ettiği değeri değiştiremeyeceğiniz anlamına gelir.
Şimdi bunu çalıştırdığımızda çıktı olarak 81'i görmeliyiz.
Yine, bunun bize söylediği
şey verileri değiştirdiğimizdir.
Bu
değişken, bu yerel değişken num, fonksiyon içinde değiştirildi ve değeri değişti.
Bu normal değil. Bu kavramı şimdiye kadar öğrenemedik. Bu referansla aktarılır.
Ancak c'de olan şey, adresin bir kopyasını iletiyor olmanızdır.
Bu yüzden gerçekten gereksizdir, sabite bile ihtiyacımız yoktur çünkü işaretçinin
değerini değiştirsek bile, işaretçinin değerinin bir kopyasıdır,
bu yüzden bunu yapmanıza gerçekten gerek yoktur.
Şimdi eğer mevcut bir sayıyı kullanmak istemiyorsak bir işaretçi oluşturabiliriz,
sadece bunun için bellek ayırmamız gerekir.
Yani burada yapmamız gereken şey, bir int yıldız numarası oluşturmaktır.
Ancak yapmamız gereken şey önce malloc'u cast etmektir çünkü malloc
bir void pointer ile geri döner ancak biz belleği
dinamik olarak tahsis edebiliriz.
Ve burada, sadece bir tamsayı oluşturduğumuz
için, sadece int boyutunu söyleyebilirdik ve bu bizim
için bellek ayırırdı.
Ve sonra, tek yapmamız gereken kare num'a geçmek.
Ve sonra bunu oluşturduğumuzda,
aynı şeyi yapacaktır, ancak şimdi num için de
bir değer yoktur, bu yüzden aslında neyi hesaplayacağınızı
bilemezsiniz, bu yüzden aslında
num değerine atamanız gerekir, burada dört diyeceğiz,
onu referans dışı bırakırsınız.
Ve
şimdi onu oluşturup çalıştırdığınızda 16 almalısınız.
Şimdi buradaki tek şey değeri yazdırmak istememiz, bu yüzden num demek istiyoruz.
Ve sonra çalıştırdığımızda 16 görmeliyiz.
Ve bu gerçekten de aynı türden bir davranış
ve biz 16 tane görüyoruz.
Buradaki tek fark, ampersand ile mevcut bir bellek
konumuna işaret etmek yerine, noktanın işaret ettiği şey için bellek
ayırıyor olmamızdı.
Yine burada dikkat edilmesi gereken önemli bir husus, bu sayının fonksiyon dışında
değişiyor olmasıdır. Bu referans anlayışıyla
aktarılır. Burada, noktanın işaret ettiği şeyin değerini almak
için de-reference operatörünü, yani dolaylama operatörünü kullanıyoruz.
Fonksiyon bir işaretçi alıyorsa ve elimizde bir işaretçi varsa,
sadece ismi gönderebileceğimizi anlayın.
Eğer bir işaretçi almıyorsa ve
aslında bir değerse, o zaman referansı
kaldırmamız gerekir. Bu da tıpkı scanf gibi.
Yani burada ampersand dememiz gerekiyor.
Ve ayrıca yazdırdığımızda, bir işaretçi
olmadığı için hiçbir şeyi referans dışı bırakmak zorunda
kalmayız ve burada da aynı şey olur.
Ve sonra const ikiyi anlayın. int yıldızından önceki Const, noktanın
işaret ettiği değerin değişemeyeceğini söyler.
int başlangıcından sonraki const, işaretçinin adresinin işaretçinin değerini değiştiremeyeceğini söylüyor.
Umarım bu yardımcı olmuştur.
Yine, bununla oynayın, bazı sözdizimlerini değiştirin, benim yaptığım gibi karıştırın.
Çok şey öğrenmenize yardımcı olacaktır. Teşekkür ederim.