Merhaba, tekrar hoş geldiniz.
Bu derste, bir işaretçinin işaret ettiği değere erişim hakkında
konuşmak istiyorum İşaretçileri
hatırlayın, bellek adreslerini saklarlar.
Bu bellek adresi aslında bir yerde bir değer içerir.
Ve böylece işaretçiler bu bellek adresine işaret eder. İşaret ettiği şeyin değerini
almak istiyorum.
Çünkü bir adres olacak bir işaretçinin değerini yazdırabilirim, ancak adresi almak istiyorum, adresin
değerini almak istiyorum.
Böylece, bir işaretçinin işaret ettiği adresin değerine dolaylama operatörünü
kullanarak erişebilirsiniz. Dolaylama operatörü yıldız işaretidir.
Böylece bir işaretçiyi bildirmek için yıldız işaretini nasıl kullanacağımızı
öğrendik, ayrıca bir işaretçinin işaret ettiği değeri bulmak için yıldız işaretini kullanacağız.
Bu yüzden dereferans operatörü olarak da adlandırılır çünkü bir
işaretçiyi dereferanslamak için kullanırsınız.
Örneğin, 15'e eşit bir sayınız varsa, int türünde bir gösterici bildirirsiniz,
bir int'i işaret eder ve ve işareti kullanarak sayının adresini atarsınız.
Şimdi işaretçinin işaret ettiği değeri nasıl elde edersiniz.
Referansı kaldırabilirsiniz.
Temel olarak işaretçinin işaret ettiği değerin 15 olduğunu
görebilirsiniz çünkü 15 olan sayının adresine işaret etmektedir.
Yani işaretçi değişken, değişken numarasının adresini içerir.
Sonuç için yeni bir değer hesaplamak üzere bunu bir ifadede kullanabilirsiniz.
Diyelim ki sonucu, işaretçinin gösterdiği değer
artı beşe eşit yapmak istedik. Bunun için işaretçinin adından önce
yıldız işaretini kullanırsınız.
Bunun yapacağı şey, temel olarak işaretçi değişkenin neyi işaret
ettiğini söylemektir, 15'i işaret ediyor, ona beş ekleyin.
İşaretçinin işaret ettiği
adres, bu adresin değerinin ne olduğudur.
Dikkat etmeniz gereken dolaylama operatörü
yıldız işareti aynı zamanda çarpma işlemi için kullanılan semboldür ve işaretçi türlerini
bildirirken de kullanılır. Yani bu çok kafa karıştırıcı olabilir.
Neler olup bittiğini ya da derleyicinin nasıl çalıştığını nereden biliyorsunuz?
Her şey bağlamla ilgili. Bu yıldız işaretini ne zaman ve nerede kullandığınıza bağlıdır.
Bir işaretçiyi bildirirken işaretçinin türünden hemen sonra yıldız işareti
kullanıyorsanız, o
zaman açıkça bir bildirim kullanıyorsunuz demektir.
Yıldız işaretini iki sayı arasında kullanırsanız,
çarpma işlemi için kullanılıyor demektir. Örneğin sağ taraftaki ya da
sol taraftaki işaretçi adından hemen önce kullanılıyorsa, bir değer
atıyor ya da bir değere erişiyor olacaktır.
Dolayısıyla, bu dolaylama operatörünü kullanırken her şey bağlamla
ilgilidir.
İşler böyle yürüyor.
Yani derleyici bunu bu şekilde yorumlayacaktır.
Bu örnekte, yıldız işaretçisini gördüğünüzde ve
öncesinde bir veri türünüz yoksa veya her iki tarafta iki sayı
yoksa, bunun bir dolaylı işaretçi olduğunu bilirsiniz.
Şimdi bir örnek üzerinden gidelim. İşte 10'a eşit bir
tamsayı sayısı oluşturacağımız
başka bir örnek. Ayrıca x adında tamsayı türünde başka bir değişken oluşturacağız.
count öğesini 10 olarak başlatıyoruz, x öğesini ise hiçbir şey olarak başlatmıyoruz.
Daha sonra bir int işaretçi oluşturuyoruz. Bunun bir int pointer olduğunu biliyoruz
çünkü veri tipinden sonra yıldız işareti var ve
sonra int pointer olarak adlandırdık.
Şimdi bu int işaretçisine count öğesinin adresini atayacağız.
Çünkü unutmayın, işaretçiler değerleri olarak yalnızca adresleri içerirler, ancak
aynı zamanda bir şeye işaret ederler.
Böylece int pointer'ın işaret ettiği x değişkenine, pointer'da
bulunan adresin değeri ne ise onu atayabiliriz.
Yani x aslında 10 gösterecek.
10. Dolayısıyla, devam edip bunu sayım yüzde
d ird x yüzde ird şeklinde gösterirsek, sayım 10'a eşittir, x de 10'a eşit olacaktır.
Bu şekilde bir işaretçinin referansını kaldırabilir ve o değeri alabilirsiniz. İşaretçinin değerlerini görüntülemek
istiyorsanız işaret eder, çünkü bir işaretçinin bellekte
bir değeri olduğunu unutmayın, bu sadece
bir adrestir. Peki ya onaltılık sayı tamsayısı
ve adres ile temsil edilen işaretçi değerini
görüntülemek isterseniz?
Yüzde p biçim belirtecini kullanabilirsiniz. Bunu daha önce konuşmuştuk.
Bu, onaltılık biçimde bir bellek adresi olarak bir işaretçi değeri çıktısı verecektir.
Eğer böyle bir şey yapacak olsaydık,
sayımızı bildirir, işaretçimizi
bildirir ve onu null olarak başlatırdık çünkü bu iyi bir uygulamadır, bir bildirimde işaretçiye
bir şey atamadığınız her zaman bunu yapmak isteriz, onu null olarak başlattığınızdan emin
olun.
Daha sonra sayı değişkenimizi 10 olarak atarız.
Ve sonra işaretçimizi sayının adresine atarız.
Yani p sayısının değeri aslında bir adres olacaktır.
bir adres. Yani bunu yazdırmaya çalışsaydık, p yüzdesini kullanırdık ve bu da adresin değeri olurdu.
İşaret ettiği şeyi yazdırmak isteseydik, dolaylama operatörünü
kullanarak referansı kaldırmamız gerekirdi.
Ancak adresi yazdırdığınızda, yaptığı şey onaltılık olarak
yazdırmaktır ve işaretçiler bellekte 8 bayt yer
kaplar ve adresler 16 onaltılık
basamaklıdır. Peki bu nasıl oluyor?
Bu, makinenizin 64 bit ya da 32 bit adresleri destekleyip desteklemediğine bağlıdır.
Makineniz 64 bit işletim sistemine sahipse,
16 onaltılık basamak göreceksiniz.
Makineniz veya işletim sisteminiz yalnızca 32 bit adreslemeye sahipse,
onaltılık sayının 8 onaltılık basamak olarak temsil edildiğini görürsünüz.
Peki ya bir adres görüntülemek istiyorsanız?
Ne fark eder ki diyebilirsiniz çünkü işaretçinin bir değeri vardır.
Ancak adresi operatörün adresiyle birlikte de görüntüleyebilirsiniz.
Bu örnekte, numaranın adresini görüntülemek istiyoruz.
Sayı bir işaretçi değildir. Sayı sadece bir tam sayıdır.
Bunun adresini almak istiyorsak, ve işaretini kullanırız.
Bunun adresini görüntülemek istersek, yine yüzde p'yi kullanmanız yeterlidir.
Sadece ampersand uygulayın.
Dolayısıyla, işaretçi değişkenine ve işareti eklersek, aslında
noktanın değerini değil, işaretçinin
adresini görüntülemiş oluruz. İşaretçinin adresinin bellekteki bir adres olduğunu unutmayın.
İşaretçi değeri, işaret ettiği bir adrestir.
Ve işaret ettiği değer bellekte başka bir yerdedir.
İşaretçilerin nasıl çalıştığını
gösterdiğimiz resmi hatırlayın.
Bir işaretçiyi bildirdiğinizde, bu işaretçi için 8 baytlık bir bellek
oluşturur.
Bu işaretçinin değeri bir adrestir.
Ve sonra bu işaretçinin işaret ettiği
şey, genellikle sağladığınız türde bir değerdir.
Ancak bunun gerçekten üç bölümden oluştuğunu unutmayın.
Eğer p numaralarının adresini yazdırmak istiyorsanız, yine ve işaretini kullanırsınız.
Bu, gerçek işaretçinin adresi olacaktır.
Ve bir uyarıyı aşmak için boşluk yıldızını kullanmanız gerekir.
Unutmayın, bir işaretçinin de tıpkı diğer değişkenler gibi bir adresi vardır
ve siz onu bildirdiğinizde tahsis edilir.
Adresleri görüntülemek için dönüştürme belirteci olarak yüzde p kullanırsınız.
p number değişkeninin kapladığı adrese başvurmak için ampersand the
address of operatörünü kullanırsınız.
Bu işaretçinin adresi. Sonra tekrar, işaretçinin bir
adres değeri vardır.
Cast a void, derleyicinin bir uyarı vermesini önlemek içindir,
özellikle p yüzdesi belirtimi değerin bir tür işaretçi türü olmasını bekler.
Ancak ampersand sayısının türü, onun bir işaretçisine bir işaretçidir.
Ve bu yüzden onu atmak zorundasın.
Bir işaretçinin kullandığı bayt sayısını görüntüler.
Bir işaretçi hakkında bilgi almanın başka bir yolu.
Burada sizeof operatörünü kullanabilirsiniz. Farklı veri türlerini bayt olarak görüntülemek
için sizeof operatörünü öğrendik. Aynı şeyi bir işaretçi ile de yapabilirsiniz.
Çalıştırdığım bir makinede bu 8 baytlık bir yer kaplayacaktır.
Makine adresi 64 bittir çünkü 64
bit işletim sistemidir.
Ve sizeof bu şekilde kullanıldığında bir derleyici uyarısı alabilirsiniz, sizet
uygulama tanımlı bir tamsayı türüdür.
Uyarıyı önlemek için, argümanı aşağıdaki gibi bir int türüne dönüştürebilirsiniz.
Yani yapacağınız şey, p sayı boyutu, yüzde d bayt demek olacaktır.
Ve int dersiniz, bunu inç boyutunda bir p sayısına atarsınız.
Bu size bellekteki işaretçinin boyutunu, bu adresin işaretçisinin boyutunu
verecektir, ki bu da çoğu sistemde sekiz bayttır.
Çünkü bu sadece bir adres içeriyor.
Burada başka bir örnek var. Bu, bir dizi şeyi gösterecektir.
Ve çıktıyı göstermek için bu örneği çalıştıracağız.
Ancak çalıştırmadan hemen önce, burada neler olduğunu biraz açıklamak istiyorum. Açıklanmış bir numaramız var.
Başlangıç değeri null olan bir işaretçimiz var.
Sayı değerini 10 olarak ayarladık.
Ve sonra yapmak istediğimiz şey, tam sayının adresini
yazdırmak istiyoruz ve sayının değerini yazdırmak istiyoruz, çok basit, operatörün
adresini ve ardından sadece değişkeni kullanarak.
Operatörün adresini yaptığımızda, yüzde p yaparız.
Daha sonra numaranın adresini işaretçimize atayacağız.
Daha sonra bazı işaretçi bilgilerini yazdıracağız.
İşaretçinin kendisinin adresinin çıktısını almak istiyoruz.
Sadece yüzde p, boş yıldız ampersand sayısını kullanabiliriz.
Bu işaretçinin bellekte kaç bayt olduğunu görmek istiyoruz. Sizeof diyebiliriz.
Bir adres olan işaretçinin gerçek değerini
görmek istiyoruz. Herhangi bir ekstra bilgi olmadan sadece p
sayısını söyleyebiliriz ve sonra yüzde p'yi kullanırız.
İşaretçinin işaret ettiği değeri, adresteki
değeri görmek istiyorsak, o zaman yıldız p sayısı
yaparız, dolaylama operatörünü kullanırız.
Ve p sayısının bir içeri işaret ettiğini biliyoruz, bu yüzden yüzde d diyebiliriz.
Gerçekte nasıl görüntülendiğini görmek için bu örneğe kod blokları halinde bir göz atalım.
Adresleri görüntülediğimizde adresler için
bazı onaltılık sayılar göreceğiz ve diğer durumlarda değerleri göreceğiz.
Yani bu tanıdık gelecektir. Bu sadece bir işaretçinin farklı
bölümlerine nasıl erişileceğini gösteren bir programdır.
Yani yine normal sayı veri tipimiz int ve işaretçimiz
var. Onu null olarak başlatıyoruz.
İlk olarak 10 olan sayımızı görüntüleyeceğiz. Yani bu, sayının adresini gösterecek ve
ardından 10. ve 11. satırlarda sayının değerini gösterecektir.
Daha sonra işaretçimizi, sayının adresine atayacağız.
İşaretçimizin gerçek adresini görmek istiyorsak, sadece ve işaretini, operatörün
adresini kullanırız ve onu void star'a atarız.
Yüzde p kullanıyoruz.
İşaretçinin bellekte kaç bayt olduğunu görmek istiyorsak yüzde d sizeof yaparız.
Yerfıstığı işaretçisinin değerinin adresini görmek istiyorsak, yüzde p yaparız
ve sadece p sayısı deriz, çünkü p sayısı bir adrestir.
İşaretçinin değerindeki adresin değeri ile işaretçinin neye işaret
ettiğini görmek istiyorsak, sadece yıldız p sayısı deriz,
dolaylama operatörü olan dereferans yaparız.
Hadi şunu çalıştıralım.
Bunu çalıştırdığımda, yazdırılan ilk iki şeyi göreceksiniz,
altıncı satırdaki sayı adresi ve bu 0060ff0c
gibi onaltılık bir sayıdır.
Ve bu aslında 32 bitlik bir program çalıştırıyor, yani sadece 8 bit olduğunu görüyorsunuz.
sayı değişkeni 10'dur.
Daha sonra tahsis edilen belleğin gerçek işaretçisinin adresini yazdırırız.
Numaradan farklı bir adres.
Çünkü bu, işaretçi için tahsis edilen adrestir.
İşaretçi numarası boyutu 4 bayttır ve bu da 32 bitlik
bir adresleme olduğu anlamına gelir.
Sayının adresi olan işaretçinin
değeri aynı olmalıdır ve öyledir, 0060ff0c.
Ve aslında sadece ismi, p yüzdeli işaretçiyi kullanarak
numara adresini alabileceğinizi görüyorsunuz.
Operatör boyutunun 4 bayt olduğunu gördük.
Eğer p sayısının işaret ettiği değeri, yani 10'u almak istiyorsanız, dolaylama
operatörünü kullanarak referansını kaldırmanız gerekir ve 10 yazdırıldığını görürsünüz.
Ancak adresleri görüntülerken p yüzdesini kullandığınızı, tamsayı
işaretçisinin değerlerini veya bayt sayısını görüntülerken e yüzdesini kullandığınızı
görürsünüz.
Bu, işaretçi değerlerine erişmenin temel sözdizimidir.
İşaretçinin adresi, ve işareti, işaretçinin
gösterdiği değer, sadece değişkenin adı ve işaretçinin
değeri sadece değişkenin adıdır, sonra işaretçinin gösterdiği değer
dolaylama operatörünü kullanır.
Teşekkür ederim. Umarım bu yardımcı olur. Bunu çalışın, bunu gözden geçirin.