30 Aralık 2007 Pazar

c programlama pointer

Bu yazıda eğer bilgisayar bölümünde değilseniz çoğunlukla okullarda göremeyeceğiniz ancak oldukça önem taşıyan bir konu olan pointerla aşınalık sağlayarak üzerinizdeki zor gibi görünen bu konudaki korkuyu atmaya çalışacağız.
Öncelikle, kısaca bahsetmek gerekirse bir integer değişkenin hafızada integer değeri tutması gibi, ya da bir double değişkenin ondalıklı sayılar tutması gibi pointer da adres değeri tutan değişkendir. Yani içinde tuttuğu adres başka bir değişkenin adresine point eder diyebiliriz.İsterseniz bir örnek üzerinde açıklayalım.
int *p;
int i;
int j=10;

komutu ile bir integer değişkenin adresini tutan p isimli bir pointer ve de i ve j isminde iki integer tanımlayıp dahası j’nin değerini tanımlanır tanımlanmaz 10’a eşitlemiş olduk.
Şimdi i=j; diyerek i’nin de 10 olmasını sağlayabildiğimiz gibi
p=&j; komutu ile p pointerının j değişkeninin adresini tutmasını sağlayabiliriz.
Ancak dikkat etmemiz gereken nasıl i=j; derken i’nin karşısına yine bir integer değer geliyorsa aynı şekilde adres tutan p pointerının karşısına da j’nin adresi olan &j’nin geliyor olması. Yani &j demek, j’nin memorydeki(hafızadaki) adresi demek oluyor. Bir de bunu tersi olan * işareti var ki *p de bize p pointerının gösterdiği adresin içeriğini veriyor.
Yani şu durumda cout<<*p; gibi bir satır ‘p pointerının gösterdiği adresin içinde ne varsa onu ekrana yaz’ demek olacağından 10 rakamını ekranda gösterecektir.
Diyebiliriz ki C++’da array(dizi) olarak bildiğiniz şey, aslında pointer yapısına sahip. Yani arrayin sıfırıncı elemanına point eden bir pointer var elimizde ve tüm diğer elemanlar da hafızada sıfırıncı elemanın yanına öylece dizilmiş haldeler. İşte array dediğimiz şey de bu yapıdan başka bir şey değil.
Örneğin;
int x[2][3]; komutu bize nasıl 2’ye 3 lük bir matris tanımlama imkanı veriyorsa ve onun (i,j)’inci elemanına x[2][3]; şeklinde ulaşıyorsak, bu aslında şunu yazmaktan farklı bir şey değil;
*(&x[0][0]+3i+j) burada &x[0][0] bize (0,0)ıncı elemanın adresini veriyor.
Bunu sütun sayısı olan 3 ile çarpıp j ile topladığınızda da (i,j)nci elemana ulaşmış oluyorsunuz.
Ufak ve şirin bir kısaltma olarak C++’da &x[0][0] yerine x kullanabiliyoruz.
Yani demek oluyor ki;
*(x+3i+j) ibaresi de (i,j)nci elemanı ifade etmemizi sağlıyor.
Şu an x[i][j] gibi kolay bir ifadeyi pointerlar ile ifade edip niye kalabalık yaptığımıza bir anlam verememeniz doğal. Ancak emin olun ki bazı durumlarda arraylarle uğraşmaktansa direkt pointer aritmetiği kullanarak işimizi çok daha kolay halledebileceğimizi ilerde anlayacaksınız.
Pointerlarin kullanıldığı en rahat anlaşılır ve etkin yerlereden biri dinamik hafıza kontrolüdür (dynamic memory management). Bir dahaki sefere uygulamalı olarak pointerların bize nasıl program ortasında değişken oluşturma ve yine istediğimiz anda ortadan kaldırma imkanı verdiğinden bahsedeceğiz. Bu defa sadece bilmeyenlerin pointerları kabaca tanımalarını ve varsa korkuyu üzerlerinden atmalarını amaçladım.
ALINTI
------------------
Gece gece böyle bi konu bulduk.(nerden bulduysam, eh insan oyun programcısıyla konuşursa gece gece bile kodlarla uğraşır )
Bende daha şu saatlerde karşılaştım bu pointer denilen şeyle aslında C++ ile ilgilenmem ama yeri gelmişken öyle bir kişiden pointer konusunu dinlemek hoş bişi Galiba bu kadar karıştırılan şeyi ben anladım (bide koda çevirebilsem tam olcak )
"int a = 5; //a değişkenini 5 yapttıkint* b = &a; //b pointerına anın adresini atadık*b = 10; // bnin gösterdiği adrese 10 yazdık
burdan sonra anın değeri ne olur?"
ben: "5*10 mu ?"
"hyr 10
int* b // b nin integer pointer ı olduunu ifade ediyo02:42 &a daki & anın adresini alıyo*b de bnin gösterdiği adresteki değer demek oluyo"
ben: "onu sil bunu yazmı diyo :S"
"Evet =) bu 3 olayı kavrayabilirsen data yapılarını çok rahat anlarsın .aslında çizerek göstermem lazım daha iyi olur ama şimdi kağıt kalem yok =) "
ben: "doğrudr bi an aklımda canlandırdım kutu kutu felan "
"evet aynen öyle =)"
ben: "kutuya Ayşe girerse erkekler onu çarpar dedim (5*10) baktım olmadı dedim Ali girer ayşe kaçar "
"hehehee pointer konusu c / c++ öğrenicilerinin en zorlandığı konudur bu yüzden genelde vb yada pascal gibi başka dillerle başlarlar ama sökersen bu konuyu gerisi çorap söküğü gibi gelir =). pointerın nasıl kullanabileceğini kavrayınca onu kullanarak yeni yapılar oluşturuyosun ağaçlar / yığıtlar falan =)""
ben: "yığıt :S"
"hmm şöyle düşün üstüste konmuş n tane tabak en tepeye tabak koyabiliyosun en tepeden tabak alabiliyosun.Tabaklarda da veri var"
ben: "çörek börek"
"evet =))"
ben: "Peki bunlara resim aktarabiliyonmu ? Sadece yazımı yoksa Yoksa yoksa ..."
"istediğini tut veri olarak.bak mesela şööle bi kullanımı var yığıtları "serkan" stringini ters çevirmek istiyoz mesela yığıyta sırayla "s" "e" "r" "k" "a" "n" ekliyosun. en tepedeki tabakta ne var şimdi? "
ben: "N var"
"üstüne E yi eklediküstüne R yi eklediküstüne K y eklediksoora sırayla alıyoz tabakları "
ben : "al gülüm ver gülüm O masadan diğer masaya geçirdin.En üstteki en alta geldi.bide bunu koda çevirebilsem çok şey yapcamda "
"hehehe"
Böylece konuyu reel yaptıkmı konuların nası kolay anlaşılacağını göstermiş olduk

Hiç yorum yok: