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..!!!
Oracle Exadata SQL Server Goldengate Weblogic EBS ve Linux konusunda aşağıdaki konularda 7×24 Uzman Danışmanlara yada Eğitimlere mi
İhtiyacınız var [email protected] adresine mail atarak Bizimle iletişime geçebilirsiniz.
– Oracle Veritabanı Danışmanlığı
– Oracle Veritabanı Bakım ve Destek
– Exadata Danışmanlığı
– Exadata Bakım ve Destek
– SQL Server Veritabanı Danışmanlığı
– SQL Server Veritabanı Bakım ve Destek
– Goldengate Danışmanlığı
– Goldengate Bakım ve Destek
– Linux Danışmanlığı
– Linux Bakım ve Destek
– Oracle EBS Danışmanlığı
– Oracle EBS Bakım ve Destek
– Weblogic Danışmanlığı
– Weblogic Bakım ve Destek
– Oracle Veritabanı Eğitimleri
– Oracle VM Server Danışmanlığı
– Oracle VM Server Bakım ve Destek
– Oracle EPPM Danışmanlığı
– Oracle EPPM Bakım ve Destek
– Oracle Primavera Danışmanlığı
– Oracle Primavera Bakım ve Destek
– Oracle Eğitimleri
– SQL Server Eğitimleri
– Goldengate Eğitimleri
– Exadata Eğitimleri
– Linux Eğitimleri
– Oracle EBS Eğitimleri
– Oracle VM Server Eğitimleri
– Weblogic Eğitimleri
– Oracle EPPM Eğitimleri
– Oracle Primavera Eğitimleri
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
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???
hmm evet şimdi anladım. teşekkür ederim.
ö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…!!!
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?
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…!!!)
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ı..
Hanımefendi Sorunuzu Tam olarak İdrak edemediğimden Cevaplandıramadım..Lütfen Sorunuzu Daha açık olarak sorarmısınız ???
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?
-> 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…
when did this happen?