Veri Yapıları - Pointerlara Giriş

By Burak TUNGUT - 21.11.2012 - Kategori C / C++

Veri yapıları konusunda ki ilk makalemde sizlerle daha önce değindiğimiz Pointerlara devam edeceğiz.
Pointer konusundan bir kez daha bahsederek bizler için önem ve kullanım yerlerine değiniyor olacağız.

Aslında yazılım literatüründe her ne kadar Türkçe kelimeler ile anlaşmak güç ve anlamsız olsa da işaretçi olarak adlandırdığımız Pointerları bir kez daha tanıyalım ve C# için daha önceki makalelerimde yer verdiğim bir kaç konu ile bağdaştıralım.

Pointer Kavramı

Pointer kavramının ne olduğuna gelirsek, aslında uygulama içersinde her ne kadar farketmesek de RAM ile ilgili bütün işlerimizde yer alan bu kavram en kısa şekilde değer olarak başka bir değişkenin adresini tutan değişkenler diyebiliriz.
Zaten pointerları diğer değişkenlerden ayırt eden en büyük özellik de budur. Yani değişkenler bir değer taşırken, pointerlar değere sahip olan herhangi bir değişkenin adresini değer olarak taşılar.

Daha iyi bir şekilde kavramak için küçük bir örnek yapalım,
{
       int burak = 50;
}
Yukarıdaki gibi bir kod bloğu ile burak adına sahip bir integer değişken tanımladık. Ram'da ki adresini tamamiyle atıyor ve aşağıdaki gibi bir görünüm çiziyorum,
 

Değer adı burak  
Adresi 253670  
İçeriği 50 ...

Yani stack memory üzerinde 253670 adresli bölgede 50 değeri tutuluyor.

Şimdi ise aynı değişkene pointer üzerinden nasıl ulaşabileceğimizi inceleyelim. Bunun için öncelikle bir pointer tanımlayalım ve içeriğine tanımladığımız değişkenin adresini atayalım.
{
       int burak = 50;
       int *ptr = &burak;
}
Hemen bir hatırlatma yapalım. Bir pointer tanımlamanın, değişken tanımlamadan tek farkı; atayacağımız ismin önünde * (Indirection) ekinin gelmesi. Dikkat etmemiz gereken en önemli nokta ise pointerın içine adresini atacağımız veri tipinin, pointer veri tipiyle aynı olması. Açıklayacak olursak, yukarıda burak değişkeni bir integer ve hiç şüphesiz bunu adresleyecek olan ptr adlı pointerda integer olmak zorundadır!
 

Peki Neden & (Ampersand) eki kullanıyoruz ?

C ve C++ da ve unsafe kod kullanımında herhangi bir değişkenin bellek üzerindeki adrese erişimimizi & (Ampersand) eki ile gerçekleştiririz. Yukarıdaki kod bloğunun devamında printf fonksiyonu ile burak ve &burak değerlerini yazdıracak olursanız, 50 ve bu değerin bellekteki adresinin ekrana yazıldığını görebilirsiniz.

Konumuz daha fazla dağılmadan devam edelim ve son kod bloğu ile Ram üzerinde ki görünümü simüle edelim,

 

Değer adı burak ptr  
Adresi 253670 253696  
İçeriği 50 253670 ...


Gördüğünüz üzere ptr adlı pointer değişkeninin içeriği yani aldığı değer, içeriği 50 olan burak adlı değişken ile aynı.
Yani artık adresini aldığımız bu değişkene direkt olmadan ulaşabiliriz.

Devamı

C# Constructors Metotlar

By Burak TUNGUT - 21.11.2012 - Kategori C#

Bu yazımıda C# da Constructors yani yapılandırıcı metotlar konusunu işliyor olacağız.
Yazımız ile sınıflar konusunda da örnekler yapmış olacağız.

Bu zamana kadar bizim ürettiğimiz ya da dolaylı yoldan instance alıp kullandığımız sınıfların public üyelerine kendimiz ulaştık ya da sınıf içersindeki çeşitli metotları kullandık. 
Constructors metotlar ise bir nesnenin, sınıftan instance aldığı zamanlarda üye değişkenlerine otomatikmen verdiği değerler ile yardımımıza koşan bir yapıdır.

Değer tipleri ve referanslar arasındaki farkları işlediğim konuda hatırlayacak olursanız referans tipleri oluşturulduğu anda default değerlere sahip oluyorlardı. Aslında bunun tek nedeni oluşturduğumuz anda ilgili sınıfın içersindeki defaurlt constructors metotunun tetiklenmesidir.

Şimdi Constructors konusunu tam anlamıyla ele alalım ve bir örnek yapalım. Ancak örnekden önce Constructors metotları diğer metotlardan ayıran iki özellikten bahsetmek istiyorum ;

  1. Constructors methotların geri dönüş değerleri yoktur.
  2. Constructors metotlar ilgili sınıf ile aynı isimde olmak zorundadırlar.
namespace Makale.Test
{
    public class User
    {
        public string Username { get; set; }
        public int Age { get; set; }
        public bool IsAdmin { get; set; }

        public void WriteInformations()
        {
            Console.WriteLine(this.Username);
            Console.WriteLine(this.Age);
            Console.WriteLine(this.IsAdmin);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            User user = new User();
            user.WriteInformations();
        }
    }
}


Uygulamada çalıştığı anda default constructors devreye girecek ve tüm propertylerin default değerlerini yazacaktır.
Şimdi ise oluşabilecek tüm durumlar için constructors metotlarımızı yazalım.

Devamı

C# Bilinçli Tür Dönüşümü

By Burak TUNGUT - 21.11.2012 - Kategori C#

Bu makalemiz de Bilinçli Tür Dönüşümleri konusunu, checked ve unchecked anahtar kelimeleriyle tanışacağız.
Bilinçsiz Tür Dönüşümleri hakkında yazdığımız makaleye ve yaptığımız örneklere buradan ulaşabilirsiniz.

Explicit yani Bilinçli tür dönüşümleri, genellikle derleyicinin ve IDE'nin izin vermediği durumlarda kullandığımız bir yapıdır ve olması muhtemel veri kayıpları söz konusu olduğu için ise son derece dikkatli bir şekilde yapılmaları gerekir.
Tıpkı bir önceki konuda olduğu gibi bilinçli tür dönüşümlerinide Büyükten Küçüğe ve Küçükten Büyüğe dönüşüm şeklinde ikiye ayırabiliriz fakat, Büyükten Küçüğe yapılan tür dönüşümleri bilinçsiz tür dönüşümleri ile tıpatıp aynı olduğu için bu konu üzerinde fazla vakit harcamayacağız.

Öncelikle tür dönüşümü yapmak için kullancağımız syntax yapısını inceleyelim,

            [DönüştürülecekTip] [DeğişkenAdı];
            (int) sayi;
            (byte) _byte;
            (decimal) _ondalik;

Bir önceki konuda yaptığımız tipik dönüşümü tekrarlayalım ve yine bir byte veriyi integer veriye çevirelim,
 

namespace Makale.Test
{
    class Program
    {
        static void Main(string[] args)
        {
            byte _byte = 350;
            int _int = (byte)_byte;

            Console.WriteLine(_int);
        }
    }
}


Ekran çıktımız 50 şeklinde olacaktır. Burada değinmek istediğim bir konu var. Bir önceki makaledede aynı örneği yaptık ama (byte) gibi bir ifade yani bilinçli tür dönüşüm ifadesi kullanmadık ve yine aynı sonucu elde ettik çünkü byte veri türü, int veri türünden daha küçüktü ve dönüşümünde herhangi bir sakınca yoktu.

Devamı

C# Bilinçsiz Tür Dönüşümü

By Burak TUNGUT - 21.11.2012 - Kategori C#

Bu makalemiz ile C# da bilinçsiz tür dönüşümlerine değinip, bol bol örnek yapacağız.
Aynı zaman da tür dönüşümü mantığına değinip, C# dilinin type safety anlayışına da değinmiş olacağız.
Bir sonraki makalemiz ile bilinçli tür dönüşümlerini de tanıyarak tür dönüşümleri konusunu bitirmiş bulunacağız.

Bu makalemiz ile C# da bilinçsiz tür dönüşümlerine değinip, bol bol örnek yapacağız.
Aynı zaman da tür dönüşümü mantığına değinip, C# dilinin type safety anlayışına da değinmiş olacağız.

Bir sonraki makalemiz ile bilinçli tür dönüşümlerini de tanıyarak tür dönüşümleri konusunu bitirmiş bulunacağız.
 

Ağustos'un son gününde, sıcak bir Antalya gününden yine herkese Merhabalar :)
Karnımız tok, kulaklığın sesi iyi derecede, kıpır kıpır bir şarkı çalıyor. Sanırım herşey olması gerektiği gibi. O zaman bügünkü konumuza artık başlayalım. Bu konudaki örneklerde bol bol debug kullanacağız diye düşünüyorum en iyisi hazırlıkları tamamlayalım artık :)

Tür Dönüşümü nedir ? Neden Kullanırız ?

Uygulamalarımız da elimizdeki nesne ya da çeşitli tiplerin, bazı durumlarda bambaşka şekilde davranmalarını ya da benzemelerini isteriz.Ya da çoğu zaman uygulamalarımız da değişkenler üzerinden çeşitli aritmetik ya da lineer işlemler gerçekleştiriz, ama iki farklı tipi bu işleme koymak çoğu zaman mümkün değildir. İşte bu ve buna benzer çoğu senaryoda tür dönüşümlerine ihtiyaç duyarız.
Sn.Sefer Algan'ın da bu konu hakkında bir örneklemesi vardı, "... Nasıl 3 elma ile 2 armutun toplamı mantığınıza ters düşüyorsa aynı şekilde 3 byte ile 2 int'in toplamıda bilgisayar açısından mantıksızdır..."

Bilinçsiz Tür Dönüşümü

Adından da anlaşıldığı üzere aslında çoğumuz yazdığımız küçük uygulamalarda bile farkında olmadan değişkenleri tür dönüşümüne maruz bırakıyoruz.
Mesela aşağıdaki gibi bir kod bloğu düşünelim,
 

namespace Makale.Test
{
    class Program
    {
        static void Main(string[] args)
        {
            int _int = 35;

            double _double;

            _double = _int;
            Console.WriteLine(_double);
        }

    }
}


Devamı

C# Ref ve Out Anahtar Kelimeleri

By Burak TUNGUT - 21.11.2012 - Kategori C#

Bu makale ile değer tipleri ve referans tiplerinin arasındaki farkları ve metotlara aktarmınında yardımımıza koşacak olan 2 adet anahtar kelimeye deyiniyor olacağız.
1 Aylık biri süreden sonra tekrar C# a geri dönüyoruz :)

Öncelikler herkese merhabalar :)

Yaklaşık 1 aylık dönemde yazamadığım makaleleri birer birer sıralamaya an itibariyle başlıyorum. Açık sözlü olacağım bu dönem için de makale yazmam çok mu imkansız dı ? Aslında hayır. Ama staj, tatil, ev taşıma vs.vs. olaylar derken bir de baktım ki bir hayli süre geçmiş :)
Hiç uzatmadan bugün için itinayla seçtiğim konuya geçelim.

Ref ve Out anahtar sözcüklerinden önce değer tipleri ile referans tiplerinin arasındaki önemli bir farktan bahsetmek istiyorum. Uygulamalarımız da sık sık deklare ettiğimiz değişkenleri düşünelim. Özellikle 2 adet sık kullandığımız ve farkını ortaya koyacak olan değişkenlerden örnek vermek istiyorum. int ve String.

Örneklediğimiz bu iki değişken arasındaki en büyük fark, int tipinin bir primitif yani değer tipi ancak String'in ise bir referans tipi olması.

Aralarındaki farka bakacak olursak. Bir primitif deklare edildiği zaman adresi ile birlikte aldığı değer RAM'in Stack bölgesinde, bir referans tipi deklare edildiği zaman ise aldığı değer(ler) RAM'in Heap bölgesinde ve bu bölgede ilgi alanı işaretleyen (pointer) kısım ise Stack bölgede yer alır.

Devamı
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
Facebook
Son Yorumlar