C# TA POİNTER KULLANIMI

Pointer değişken, bellekte tutulan bir değerin adresini göstermektedirler.

Bu konuyu daha iyi anlayabilmek için öncelikle belleğin (RAM’in) yapısını inceleyelim.

RAM’in Yapısı

Herhangi bir programlama dilinde bir program yazdık. Bu yazılımın exe dosyasını çalıştırdığımız zaman, harddiskte kayıtlı olan exe dosyası, çalışabilmek için öncelikle harddiskten daha hızlı olan RAM’e kopyalanır ve RAM – işlemci arasında çalışmasını yapar. Kayıt işlemlerinde ise harddiske yazma komutuyla işlem yapılır.

Programımız çalıştığı zaman bellekte onun için belirli bir alan ayrılmamıştır. İşlemci, dosyayı RAM içerisine rastgele yerleştirir ve adres bilgilerini kaydeder. Programımızın istenen noktasına ulaşması gerektiğinde adrese gidip o veriyi kullanabilir.

Bilgisayar sistemlerinin bu kadar gelişmediği dönemlerde bellek yönetimi çok önemli bir konuydu. Büyük çaplı bir yazılım hazırlandığında belleğin dolma ihtimali olduğundan değişkenler kullanıldığı oranda bellekte tutulur, fonksiyonlar arasında değişken göndermesi sırasında değişkenin bir kopyası değil, adres bilgisi gönderilirdi. Adres bilgisini kısaca inceleyelim:

Basitçe inceleyecek olursak, bellek aşağıdaki gibi bir yapıya sahiptir. Yazılımımız içerisinde her değişken değerini bir kutucuğa yerleştirdiğimizi düşünelim (100% bu şekilde değildir). Bu değişkenlerin değerlerine ulaşabilmek için onların adres bilgilerine ihtiyacım olacaktır. Sol tarafta görünen “… 110A, 110B, … ,110F, …” değerleri, belleğimizin adres bilgileridir. Örnekte “110C” adresli kutucuğa 22 değeri aktarılmıştır.

Bir değişkeni bir fonksiyondan diğerine göndermem gerektiğinde aşağıdaki gibi bir işlem yapabiliriz:

 private void A()

{

      int sayi2 = 22;

B(sayi2);

}

private void B(int sayi)

{ }

Bu işlem yapıldığında prosedürünün içinde tanımlanmış olan sayi2 isimli değişkenin değeri, B fonksiyonuna gönderilirken bellekte B prosedürünün için bellekte metin isminde bir değişken oluşturulur, değeri de 22 olur.

Bu işlemi pointer ile yapmış olsaydık, B prosedürüne gönderdiğimiz değer sayi2 değişkenin değeri değil, bulunduğu adres bilgisi olacaktı. Yani ben “110C” adresini gönderecektim, metin değişkeni, “110C” adresindeki değeri kullanacaktı, bellek içerisinde aynı değer için farklı bir yer ayırmasına gerek kalmazdı.

C#’ta pointer kullanabilmek için öncelikle Visual Studio’da unsafe kodlamaya izin vermemiz gerekmektedir.

Project -> ProjeAdı.Properties seçeneğini açalım.

Build sekmesinden “Allow unsafe code” seçeneğini işaretleyelim.

Şimdi pointer değişken içeren kodumuzu oluşturabiliriz.

private unsafe void MesajGoster()

{

int sayi = 22;

int* deger = &sayi;

MessageBox.Show((*deger).ToString());

}

sayi isimli Integer türünden bir değişken oluşturduk ve 22 değerini atadık.

adres isminde Integer türünde bir pointer değişken oluşturduk ve sayi değişkeninin adresini atadık.

adresi 1 artırdık.

adres adresinde bulunan değeri ekranda gösterdik:

NOTLAR:

Pointer değişkenlerinin tanımlanma kuralları:

1. Pointer değişkenler * ile tanımlanır : int* deger

2. & : Pointer olmayan bir değişkenin adres bilgisini verir:  &sayi

3. Pointer değişkendeki adres bilgisini alabilmek için değişken adını kullanmalıyız: deger = &sayi

MEHMET SALİH DEVECİ

YAZILIM MÜHENDİSİ

About Mehmet Salih Deveci

I am Founder of SysDBASoft IT and IT Tutorial and Certified Expert about Oracle & SQL Server database, Goldengate, Exadata Machine, Oracle Database Appliance administrator with 10+years experience.I have OCA, OCP, OCE RAC Expert Certificates I have worked 100+ Banking, Insurance, Finance, Telco and etc. clients as a Consultant, Insource or Outsource.I have done 200+ Operations in this clients such as Exadata Installation & PoC & Migration & Upgrade, Oracle & SQL Server Database Upgrade, Oracle RAC Installation, SQL Server AlwaysOn Installation, Database Migration, Disaster Recovery, Backup Restore, Performance Tuning, Periodic Healthchecks.I have done 2000+ Table replication with Goldengate or SQL Server Replication tool for DWH Databases in many clients.If you need Oracle DBA, SQL Server DBA, APPS DBA,  Exadata, Goldengate, EBS Consultancy and Training you can send my email adress [email protected].-                                                                                                                                                                                                                                                 -Oracle DBA, SQL Server DBA, APPS DBA,  Exadata, Goldengate, EBS ve linux Danışmanlık ve Eğitim için  [email protected] a mail atabilirsiniz.

Leave a Reply

Your email address will not be published. Required fields are marked *