Değerli Arkadaşlar C# yazı dizimize devam ederken şimdide C ve C++ gibi dillerde çokça kullandığımız ve o dillerde olmazsa olmaz kavramlardan olan Pointer ları yani işaretçileri C# dilinde de göreceğiz şunu bilmenizi isterim yüksek seviyeli dillerden olan Java dilinde Pointer yoktur C# ta bu özellik tavsiye edilmese bile vardır yeri ve zamanı gelince önemli işlerde kullanılabiliyor.Şimdi Pointer lara giriş yapalım.

Öncellikle pointer Tam olarak nedir onu görelim.Pointer değişkenler, bellekte tutulan bir değerin adresini göstermektedirler.Bu konuyu daha iyi anlayabilmek için öncelikle belleğin (RAM’in) yapısını inceleyelim böylece bellekte bir yer tutma gibi ifadeler kullandığımızda bunun tam olarak ne anlama geldiğini daha iyi anlayacaksınız.

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.Bunu sizlerde çoğaltabilirsiniz.

  Bir değişkeni bir fonksiyondan diğerine göndermemiz gerektiğinde şöyle  şey yaparız:

private void function()
{

int x = 22;

another_function(x);

}

private void another_function(int y)
{
}

Bu işlem yapıldığında prosedürünün içinde tanımlanmış olan x adlı değişkenin değeri, another
 _function adlı  fonksiyona gönderilirken bellekte another_function 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, another_function prosedürüne gönderdiğimiz değer x 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ğine tıklayalım karşımıza şu pencere çıkacaktır:

Şimdi pointer değişken içeren kodumuzu tekrardan oluşturalım.

private unsafe void button1_Click(object sender, EventArgs e)
{
int ilk_sayi = 180251;
int* referans_sayisi = &ilk_sayi;
Console.WriteLine((*referans_sayisi).ToString());
}

ilk_sayi  isimli Integer türünden bir değişken oluşturduk ve 180251 değerini atadık.referans_sayisi isminde Integer türünde bir pointer değişken oluşturduk ve ilk_sayi değişkeninin adresini atadık.adresi 1 artırdık.
referans_sayisi adresinde bulunan değeri ekranda gösterdik:

ve Aynı şekilde sonucumuz 180251 çıkmış oldu.

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

Böylece bir yazımızın daha sonuna gelmiş bulunmaktayız bir sonraki yazımızda görüşmek dileğiyle esen kalın..!!!
 

MEHMET SALİH DEVECİ

BİLGİSAYAR MÜHENDİSİ

Reklamlar
yorum
  1. leyla dedi ki:

    salih bey elinize sağlık, yalnız bi yeri anlamadım.
    şöyle demişsiniz : “ilk_sayi değişkeninin adresini atadık.adresi 1 artırdık”
    “1 artırdık” derken neyi nasıl artırdınız? kodunu göremedim yada anlamadım. yardımcı olursanız sevinirim

  2. YAZILIM UZMANI dedi ki:

    onu yukarıda ki bellek haritasına bakarak anlatayım size düşününki ilk_sayi değişkenini oluşturdum ve sistem bana 110B adresini verdi bellek haritasında ardından bende o adresi pointer a verdim ve pointer da o adresi kullanarak altında bulunan 110C adlı adres te bir yer ayırdı ve değerim artık orayı gösteriyo yani pointerın içindeki adresle onun gösterdiği değeri karıştırmışsınız adres 110B de ancak onun gösterdiği yer ise 1 sonra gelen 110C adresidir bundan dolayı adresi 1 artır yani 1 atla anlamında demek istemiştim umarım anlamışınızdır sorun varsa belirtebilirsiniz???

  3. YAZILIM UZMANI dedi ki:

    önemli değil leyla hanım önemli olan Pointer ın iç yapısını iyi bilmektir kendisi adres taşısada taşıdığı adres ise bir değer bir value taşır her zaman…!!!

  4. Kerim dedi ki:

    Hocam birşey takıldı aklıma mesela ramde bir adreste 120555 diye bir değer var.Bunun ramde hangi adreste olduğunu nasıl alırız?

    • YAZILIM UZMANI dedi ki:

      bu Ram de meselesi geniş bir mesele 🙂 Ram de derken eğer Arrayleri kastediyorsanız Array.ValueOf(120555); ile bulabilirsiniz veya Arraylist deyse yine aynı şekilde Arraylist.IndexOf(120555); gibi metotlarla bulunabilir. (şuan farklı bir bilgisayarda cevap verdiğimden derleyicim elimde olmadığından yazdığım metotlar farklı bir isimde olabilir…!!!)

  5. ayse dedi ki:

    peki VS 2010 da nasıl yapılacak solution-> proje adı->right-clik->build ve Allow unsafe kod checkbox yok..bu hatayı nasıl gidebileceğim konusunda bilginiz var mı..

    • BİLGİSAYAR MÜHENDİSİ dedi ki:

      Hanımefendi Sorunuzu Tam olarak İdrak edemediğimden Cevaplandıramadım..Lütfen Sorunuzu Daha açık olarak sorarmısınız ???

  6. onur dedi ki:

    pointerlar ile ilgili olarak “->” ifadeleri görüyorum veri yapısı dersinde fakat ne olduklarını tam olarak anlayamıyorum.Biliyorsanız kısaca söyler misiniz?

    • BİLGİSAYAR MÜHENDİSİ dedi ki:

      -> This anahtar sözcüğünü ifade eder ve pointer ın gösterdiği veya göstereceği alanlarda ki değerleri this yerine ilişkilendirmeye yarar…

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s