Veysel Uğur KIZMAZ

C# ile Pointer Degisken Tanimlama

16.06.2012Okunma Sayısı: 6861Kategori: C#.Net

Pointer degisken, bellekte tutulan bir degerin adresini göstermektedirler.
Bu konuyu daha iyi anlayabilmek için öncelikle bellegin (RAM’in) yapisini inceleyelim.
 
RAM'in Yapisi
Herhangi bir programlama dilinde bir program yazdik. Bu yazilimin exe dosyasini çalistirdigimiz zaman, harddiskte kayitli olan exe dosyasi, çalisabilmek için öncelikle harddiskten daha hizli olan RAM’e kopyalanir ve RAM – islemci arasinda çalismasini yapar. Kayit islemlerinde ise harddiske yazma komutuyla islem yapilir.
 
Programimiz çalistigi zaman bellekte onun için belirli bir alan ayrilmamistir. Islemci, dosyayi RAM içerisine rastgele yerlestirir ve adres bilgilerini kaydeder. Programimizin istenen noktasina ulasmasi gerektiginde adrese gidip o veriyi kullanabilir.
 
Bilgisayar sistemlerinin bu kadar gelismedigi dönemlerde bellek yönetimi çok önemli bir konuydu. Büyük çapli bir yazilim hazirlandiginda bellegin dolma ihtimali oldugundan degiskenler kullanildigi oranda bellekte tutulur, fonksiyonlar arasinda degisken göndermesi sirasinda degiskenin bir kopyasi degil, adres bilgisi gönderilirdi. Adres bilgisini kisaca inceleyelim:
 
Basitçe inceleyecek olursak, bellek asagidaki gibi bir yapiya sahiptir. Yazilimimiz içerisinde her degisken degerini bir kutucuga yerlestirdigimizi düsünelim (100% bu sekilde degildir). Bu degiskenlerin degerlerine ulasabilmek için onlarin adres bilgilerine ihtiyacim olacaktir. Sol tarafta görünen “… 110A, 110B, … ,110F, …” degerleri, bellegimizin adres bilgileridir. Örnekte “110C” adresli kutucuga 22 degeri aktarilmistir.
Bir degiskeni bir fonksiyondan digerine göndermem gerektiginde asagidaki gibi bir islem yapabiliriz:
 
 private void A()
{
      int sayi2 = 22;
B(sayi2);
}
private void B(int sayi)
{ }
 
Bu islem yapildiginda prosedürünün içinde tanimlanmis olan sayi2 isimli degiskenin degeri, B fonksiyonuna gönderilirken bellekte B prosedürünün için bellekte metin isminde bir degisken olusturulur, degeri de 22 olur.
Bu islemi pointer ile yapmis olsaydik, B prosedürüne gönderdigimiz deger sayi2 degiskenin degeri degil, bulundugu adres bilgisi olacakti. Yani ben “110C” adresini gönderecektim, metin degiskeni, “110C” adresindeki degeri kullanacakti, bellek içerisinde ayni deger için farkli bir yer ayirmasina gerek kalmazdi.
 
 
C#’ta pointer kullanabilmek için öncelikle Visual Studio’da unsafe kodlamaya izin vermemiz gerekmektedir.
Project -> ProjeAdi.Properties seçenegini açalim.
 
Build sekmesinden “Allow unsafe code” seçenegini isaretleyelim.
Simdi pointer degisken içeren kodumuzu olusturabiliriz.
 
private unsafe void MesajGoster()
{
int sayi = 22;
int* deger = &sayi;
MessageBox.Show((*deger).ToString());
}
 
sayi isimli Integer türünden bir degisken olusturduk ve 22 degerini atadik.
adres isminde Integer türünde bir pointer degisken olusturduk ve sayi degiskeninin adresini atadik.
adresi 1 artirdik.
adres adresinde bulunan degeri ekranda gösterdik:
 
NOTLAR:
Pointer degiskenlerinin tanimlanma kurallari:
1. Pointer degiskenler * ile tanimlanir : int* deger
2. & : Pointer olmayan bir degiskenin adres bilgisini verir:  &sayi
3. Pointer degiskendeki adres bilgisini alabilmek için degisken adini kullanmaliyiz: deger = &sayi
 

Veysel Ugur KIZMAZ