Bir Bilgisayar Mühendisi İçin Programlama Dili, Öğrendiklerini Sınadığı, Deneyler Yaptığı Bir Laboratuardır. Ve Mühendisler Deneylerini, Kestiremedikleri Sonuçları Gözlemlemek İçin Değil, Öngördükleri Sonuçları Doğrulamak İçin Yaparlar...
Programlama Günlüğü > Visual Basic > Visual Basicte İşaretçiler(Pointerlar)
Visual Basicte İşaretçiler(Pointerlar)
   İşaretçiler C ve türevlerinde genelde dinamik diziler oluşturmak amacıyla kullanılırlar ve VB, özel işaretçi değişkenlere gerek bırakmayacak yerleşik komutlara zaten sahiptir( ReDim ve ReDim Preserve). Bu yüzden işaretçiler VBde çok kullanılmadığı için pek göz önünde değildirler ve bir VB programcısının karşısına pek çıkmazlar...

   Aslında işaretçilerin ne işe yaradıkları düşünüldüğünde bir dilin bu tip değişkenlere sahip olup olmadığı sorusu önemini yitirir. İşaretçiler bellek üzerindeki bir adrese işaret ederler. Yaptıkları tek şey adres bilgisi saklamaktır ve sakladıkları adres değerini basit long tipinde bir değişken içerisinde saklamak mümkündür.(Tutulan adres değeri gerçek fiziksel adres değildir.) Dolayısıyla işaretçi değişkenlerin varlığından çok, asıl sorgulanması gereken şey referans ve dereferans operatörlerinin varlığıdır...

   Şimdi soru netleşti; VBde referans ve dereferans operatörleri var mıdır? Referans operatörlerinin yerine geçecek anahtar sözcüklere sahip olmasına rağmen VB, bir işaretçinin işaret ettiği adres konumundan direkt olarak veri okuyamaz. Ancak sistem çağrıları ile hem adres alma hem de adresten okuma işlemleri gerçekleştirilebilir. Referans ve dereferans operatörlerinin görevi kernel32 kütüphanesinin RtlMoveMemory fonksiyonu ile yerine getirilebilir. Yöntem aşağıda örneklenmiştir...

   Bazı sistem çağrıları parametre olarak bir işaretçi alabilir. Genelde bu parametreler "Any" tipinde tanımlanır. Any tipi, tip denetimini devredışı bırakır ve çağrılan fonksiyonlara herhangi bir değişkenin gönderilebilmesine olanak sağlar. VBnin bu tip parametrelere adres yollayabilmesi için VarPtr, StrPtr veya ObjPtr fonksiyonları kullanılabilir. Bu fonksiyonlar C dilindeki & operatörünün görevini görür. Bu sayede adres alma işleminin gerçekleştirilmesi için RtlMoveMemory fonksiyonuna gerek kalmaz...

   ObjPtr nesnelerin, VarPtr ise herhangi bir değişkenin adresini verir. StrPtr ise farklı olarak, asıl konumdan 4 bayt sonrasını verir. Çünkü string tipli bir değişken, konumlandırıldığı yerin ilk 4 baytını uzunluğu belirtmek için kullanır. Ayrıca her karakter 2 bayt yer kaplar.
Private Declare Sub Kopyala Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Private Sub Command1_Click()
    Dim a As Integer
    a = 5
    Dim Adresi As Long
    Adresi = VarPtr(a) 'Adresini alıyoruz.
   
    Kopyala ByVal Adresi, 56, 2 'Adresin bulunduğu konuma 2 baytlık veri yazdık.
   
    MsgBox a 'İşaretçinin işaret ettiği bölgeye yazdığımız veri değişkene de yansıdı.
   
    Dim b As Integer
    Kopyala b, ByVal Adresi, 2 'Dereferans operatörünün işlevini yerine getirtmiş olduk.
   
    MsgBox b
End Sub

   Bunlar dışında bu konuda bahsedilmesi gereken ByVal ve ByRef anahtar sözcükleri var. ByVal değişkenin bir kopyasını oluşturur. ByRef ise değişkenin kendisini alır. C dilindeki kullanım ile karşılaştıracak olursak "ByRef degisken as integer" ifadesi C'de "int &degisken" ifadesine eşdeğerdir...
 
Okunma Sayısı: 168
Yayınlanma Tarihi: 13 Temmuz 2010 Salı - 10:24
Anahtar Kelimeler: işaretçi, pointer, referans operatörü, adres, değişken, varptr, strptr, objptr, byref, byval, value, reference

Onaylı yorum bulunmuyor.
Yorum/Görüş Bildir
Yorumları html kodu veya özel karakter kullanmadan, yazım kurallarına
dikkat ederek ve düzgün bir Türkçe kullanarak yazalım...
 
      Atasoy Blog v3.0 © 2009-2010 Hüseyin Atasoy | Tema Tasarımı: Hüseyin Atasoy
AtasoyWeb Firefox'u Önerir :) | Yukarı Çık