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

C#’ta Gösterici(Pointer) – Göstericilerde Aritmatik İşlemler – VI

Merhaba,

Önceki 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 göstericiler üzerinde aritmatik işlemleri değerlendiriyor olacağız.

Göstericiler İle Sabit Tamsayı Değerlerini Toplama/Çıkarma

Göstericiler üzerinde sabit tamsayı değerler ile ekleme ve çıkarma gibi aritmatik işlemler gerçekleştirebiliriz. Ancak bu göstericilerde yapılan bu işlemler normal değişkenlere nazaran biraz farklı işlevsellik göstermektedir. Göstericiye sabit bir tamsayısal değerin eklenmesi yahut çıkarılması göstericinin adres bileşenini göstericinin türünün byte değeri kadar arttırmak yahut azaltmak mahiyetine gelmektedir. Yani demek istediğim o ki; göstericiler üzerinde yapılan aritmatik işlemler, göstericinin değerinde değil göstericinin tuttuğu bellek adresinde uygulanacaktır.

Herşeyden önce şunu tekrardan hatırlayarak konumuza devam edelim; pointer referansını int/uint gibi tam sayılara cast edersek eğer işaretçinin tuttuğu bellek adresine erişebilmekteyiz. Bunun için aşağıdaki örnek kod bloğunu incelemeniz yeterlidir.

            unsafe
            {
                int i = 10;
                int* ipointer = &i;
                Console.WriteLine((int)ipointer);
            }

C#’ta Gösterici(Pointer) – Göstericilerde Aritmatik İşlemler – VI
Önceki makalelerimizde değindiğimiz bu hususu öncelikle hatırlatmamın sebebi, birazdan detaylandıracağımız göstericiler üzerindeki yapacağımız aritmatik işlemlerdeki neticeleri bu bellek adresleri üzerinde elde edeceğimizdendir.

Tekrar ediyorum, göstericiye yapacağımız herhangi bir aritmatik işlem neticesinde o göstericinin tuttuğu bellek adresindeki değere gösterici türünün içerdiği byte sayısı kadar işlem yapmak demektir.

Değişken Tipleri
Yukarıdaki tabloda türlerin kaç byte olduğunu görmektesiniz.

Şöyle bir örnek vermek gerekirse;
Eğer ki “int” türünden bir gösterici ile “1” değerini topladığımız vakit göstericinin işaretlediği bellek adresi “4 byte” arttırılacaktır. Yok eğer “1” değeriyle değil “3” değeriyle topladığımız vakit göstericinin işaretlediği bellek adresi “12 byte” arttırılacaktır.

Benzer mantıkla; eğer ki “char” türünden bir göstericiyi “2” değeri ile topladığımızda göstericinin işaretlediği bellek adresi “4 byte” arttırılacaktır. Yok eğer “1” değerini çıkarırsak eğer bu seferde göstericinin işaretlediği bellek adresi “2 byte” azaltılacaktır.

Birazdan kodlar üzerinden pratik örneklerle gideceğiz. Amma velakin örneklerimize gelmeden bu işlemler için hangi operatörleri kullanabilmekteyiz onlara bakalım…

+, -, –, ++, -=, += bu operatörlerin hepsini gönül rahatlığıyla kullanabilirsiniz.

Şimdi aşağıdaki kod bloğunu inceleyiniz.

            unsafe
            {
                int* pointer1 = (int*)100; // 4 byte
                char* pointer2 = (char*)100; // 2 byte
                bool* pointer3 = (bool*)100; // 2 byte
                double* pointer4 = (double*)100; // 8 byte
                decimal* pointer5 = (decimal*)100; // 16 byte
                byte* pointer6 = (byte*)100; // 1 byte

                pointer1 += 4; // 4 x 4 = 16 byte artacaktır.
                pointer2 += 2; // 2 x 2 = 4 byte artacaktır.
                pointer3++; // 2 x 1 = 2 byte artacaktır.
                pointer4--; // 8 x 1 = 8 byte azalacaktır.
                pointer5 = pointer5 - 5; // 16 x 5 = 80 byte azalacaktır.
                pointer6 -= 10; // 1 x 10 = 10 byte azalacaktır.

                Console.WriteLine((uint)pointer1);
                Console.WriteLine((uint)pointer2);
                Console.WriteLine((uint)pointer3);
                Console.WriteLine((uint)pointer4);
                Console.WriteLine((uint)pointer5);
                Console.WriteLine((uint)pointer6);
            }

C#’ta Gösterici(Pointer) – Göstericilerde Aritmatik İşlemler – VI
Görüldüğü üzere aritmatik işlemler bu şekilde bu mantıkla gerçekleştirilmektedir.

Konuyu pekiştirmek mahiyetinde aşağıdaki örneğide incelemenizi tavsiye ediyorum.

            unsafe
            {
                int i = 3; // 4 byte
                int* ipointer = &i;
                Console.WriteLine((uint)ipointer);
                ipointer += 3; // 4 x 3 = 12 byte artacaktır.
                Console.WriteLine((uint)ipointer);
            }

C#’ta Gösterici(Pointer) – Göstericilerde Aritmatik İşlemler – VI

İki Gösterici Arasında Çıkarma İşlemi

Göstericiler sabit tamsayı değerlerinin dışında birde kendi aralarında çıkarma aritmatiğine tabi tutulabilirler. Burada dikkat edilmesi gereken tek unsur iki işaretçininde aynı veri türünden olması gerekmektedir.

Ayriyetten yapılan çıkarma işlemi neticesinde bir gösterici üretilmemektedir. İşlem göstericilerin tuttukları bellek adreslerinin farkının işaretçi türünün byte değerine bölünmesiyle sonuçlanmakta ve bu neticeyi bize geri döndürmektedir.

            unsafe
            {
                int* pointer1 = (int*)500;
                int* pointer2 = (int*)400;
                long Sonuc = pointer1 - pointer2; // (500 - 400) / 4(byte) = 25;
                Console.WriteLine(Sonuc);
            }

Yukarıdaki kod bloğunu incelerseniz eğer iki pointer arasında yapılan çıkarma işlemi neticesinde sonuç “long” olarak elde edilmektedir. Bağıntı olarak ise iki bellek adresleri birbirlerinden çıkarılmakta ve pointer türünün(int) byte değerine(4 byte) bölünmektedir. Ee haliyle bu şekilde sonuç olarak 25 değerini elde etmekteyiz.

C#’ta Gösterici(Pointer) – Göstericilerde Aritmatik İşlemler – VI

Peki bu işlem ne işe yaramaktadır?
Bu işlem iki göstericinin arasındaki farkı byte türünden elde etmemizi sağlamaktadır. Yani anlayacağınız ekleme yahut çıkarma neticesinde elde edilen sonuçların bir sağlamasıdır diyebiliriz.

void Türü Üzerine Aritmatik İşlemler

void göstericilerde herhangi bir tür bilgisi olmadığı için aritmatik işlemler yapılmamaktadır. Çünkü yukarıda gördüğünüz gibi göstericinin türüne özel byte değeri hesaba katılmakta ve işlem gerçekleştirilmektedir. Ee haliyle void göstericisinin türü belli olmadığı için ne kadarlık bir byte değerinin hesaba katılacağıda bilinmeyeceğinden dolayı bu tür gösterciler üzerinde aritmatik işlemler yasaklanmıştır.

Evet arkadaşlar. Göstericilerde aritmatik işlemleri teferruatlıca irdelediğimiz bu dolu ve yorucu makaleye son verme zamanı gelmiş bulunmaktadır. Sonraki makalemizde fixed keywordü üzerinde istişare edeceğimizi bildiririm.

Şimdilik görüşmek üzere…
İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

1 Cevap

  1. 24 Mayıs 2017

    […] bulunmaktadır. “Peki neye göre bu işlemi yapmaktadır?” diye sorarsanız eğer Göstericilerde Aritmatik İşlemler başlıklı makalemizde ne konuştuysak aynı işlevde bir aritmatik mantık ortaya […]

Bir cevap yazın

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

*