Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

C#’ta Gösterici(Pointer) – Göstericiler Arasında Tür Dönüşümleri – V

Merhaba,

C#’ta göstericileri tam teferruatlı ele aldığımız yazı dizimize beşinci makalemizden “Göstericiler Arasında Tür Dönüşümleri” başlığıyla devam ediyoruz. Yazı dizimizi takip edebilmeniz için bir önceki yazmış olduğumuz C#’ta Gösterici(Pointer) – Gösterici Bildirimi ve Gösterici Operatörleri – IV başlıklı makaleyi referans alabilir ve ilgili makale aracılığıyla yazı dizimizin diğer makalelerine erişebilirsiniz.

Evet… Şimdi hiç vakit kaybetmeden esas konumuza giriş yapalım.

Göstericiler, basit değişkenler misali tür dönüşümlerini destekleyen bir yapıya sahiptirler.
Örnek olarak aşağıdaki kod bloklarını inceleyiniz.

--- Örnek 1 ---
            unsafe
            {
                int a = 123;
                int* apointer = &a;

                char c = 'h';
                char* cpointer = &c;
                Console.WriteLine(*cpointer);

                cpointer = (char*)apointer;
                Console.WriteLine(*cpointer);
            }

C#’ta Gösterici(Pointer) - Göstericiler Arasında Tür Dönüşümleri - V

--- Örnek 2 ---
            unsafe
            {
                int a = 123;
                int* apointer = &a;
                Console.WriteLine(*apointer);

                char c = 'h';
                char* cpointer = &c;

                apointer = (int*)cpointer;
                Console.WriteLine(*apointer);
            }

C#’ta Gösterici(Pointer) - Göstericiler Arasında Tür Dönüşümleri - V.PNG

Gördüğünüz gibi iki örnektede “int*” ve “char*” türünden işaretçiler arasında bir dönüşüm gerçekleştirilmiştir. Dikkat ederseniz göstericiler arasında dönüşüm açıkça belirtilmeli, yani bilinçli tür dönüşümü gerçekleştirilmelidir.

Eğer ki aşağıdaki gibi göstericiler arasında bilinçsiz olarak tür dönüşümü yapmaya çalışırsanız derleme zamanında hata alacaksınız.
C#’ta Gösterici(Pointer) - Göstericiler Arasında Tür Dönüşümleri - V

Göstericiler arasında yapılan tür dönüşümünde göstericinin sayısal değeri değişmez. Değişen şey göstericinin türüdür.
Peki bu göstericinin sayısal değeri nedir?
Göstericilerin adres bilgileridir. Bir gösterici işaretlediği değişkenin adres bilgisini tam sayı şeklinde tutmaktadır. Bu sayıyı okumak için işaretçi referansını “int” yahut “uint” tipinden tam sayı değerlerine cast etmek yeterlidir.

        static void Main(string[] args)
        {
            unsafe
            {
                int a = 104;
                int* apointer = &a;
                Console.WriteLine($"apointer adres : {(int)apointer}");

                char b = 'g';
                char* bpointer = &b;
                Console.WriteLine($"bpointer adres : {(uint)bpointer}");

                bool c = true;
                bool* cpointer = &c;
                Console.WriteLine($"cpointer adres : {(uint)cpointer}");
            }
            Console.Read();
        }

Yukarıdaki kod bloğunu incelerseniz eğer “apointer”, “bpointer” ve “cpointer” isimli pointerların tuttukları bellek adresleri ekrana yazdırılmıştır. Bu şekilde projeyi derleyip çalıştırdığımız vakit aşağıdaki ekran görüntüsüne benzer sonuçla karşılaşılmaktadır.
C#’ta Gösterici(Pointer) - Göstericiler Arasında Tür Dönüşümleri - V.PNG
Programı her kapatıp yeniden çalıştırdığımızda ilgili değerlerin değişmesi oldukça doğaldır.

Ayrıca aşağıdaki örnekte olduğu gibi herhangi bir göstericinin sayısal bileşenine ulaşmak için pointerın ismini direkt olarak çağırmak yanlış bir kullanım olacaktır.
C#’ta Gösterici(Pointer) - Göstericiler Arasında Tür Dönüşümleri - V.PNG
İlgili göstericinin işaretlediği bellek adresini elde etmek için bir üstteki kullanımda olduğu gibi dönüşümün açık bir şekilde pointer üzerinde yapılması((int)apointer ya da (uint)apointer gibi…) gerekmektedir.

Eğer ki dönüşümsüz tüm türler üzerinde çalışmak istiyorsak “void” anahtar sözcüğü oldukça işimizi görecektir. Göstericilerle ilgili önceki makalelerimizde değindiğimiz “void” keywordü, pointer yapılarında türden bağımsız bir işaretçi ayarlamamıza imkan sağlamaktadır. “void” türünden göstericiler genellikle eski yazılmış API fonksiyonlarında “void” parametre alan fonksiyonları programlarımız içerisinden çağırmak için kullanılır.

            unsafe
            {
                void* x;
                int a = 3;
                bool b = false;
                char c = 'a';
                double d = 1.233;
                x = &a;
                x = &b;
                x = &c;
                x = &d;

                Console.WriteLine(*(double*)x);
            }

Yukarıdaki örneği incelerseniz eğer “void” türünden pointerlarda dönüşüm yapmadan tüm türleri işaretleyebilirken sadece ilgili pointerın değerini okumak istediğimiz vakit işaretlediği türe özel bir cast işlemi uygulamak mecburiyetimiz vardır.

Evet arkadaşlar…
Bu makalemizde de pointerlar ile tür dönüşümlerini yeterince detaylandırmış olduğumuza inanıyorum. Bir sonraki makalede göstericilerde aritmatik işlemlere değineceğiz.

O halde şimdilik görüşmek üzere diyelim…
İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

2 Cevaplar

  1. 15 Mayıs 2017

    […] C#’ta Gösterici(Pointer) – Göstericiler Arasında Tür Dönüşümleri – V başlıklı makalemizde göstericilerde tür dönüşümlerini ele almıştık. Şimdi ise […]

  2. 25 Mayıs 2017

    […] C#’ta Gösterici(Pointer) – Göstericiler Arasında Tür Dönüşümleri – V […]

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*