C Programlama Dili’nde İşaretçi(Pointer) Mantığı

Ceng 241 (Advanced Programming) dersini alan ve gözlemlediğim herkes yakınıyor, Pointerlar şöyle zor, pointerlar böyle zor diye. Ama aslında değiller. Sadece kitapların yazarlarını pointer başlıklarını görmeleriyle birlikte, daha karmaşık örneklerle konuya dalma gibi sapkın istekleri tutuyor. Hayır ilk başta olayın mantığını anlatan kolay bi örnek koysa, sonra döşese kazık kazık soruları, içim yanmaz. Çok güvendiğim Deitel’in C Programlama Kitabı’nda bile böyle. :S

Zira Pointer’ın mantığını kaptıktan sonra yapılmaya çalışılan programın pek de sıkıntı çıkaracağını sanmıyorum (En azından bugüne kadarki nacizane izlenimlerim böyle) Şimdi gelelim pointer’ların ipliğini pazara çıkarmaya😀

Adından da anlaşılacağı üzere “pointer point eder”, yani söz konusu değerin hafızada bulunduğu hücrenin adresini gösterir. Aşağıdaki ekran alıntılarında görünen örnekler üzerinden gitmek gerekirse,

Yukarıdaki C kodunda göründüğü gibi

printf ( “k = %d\nk’nin adresi = %d\n”,k ,&k );

satırında önce k sayısı, sonra da “&” işareti (C programlama dilinde adres operatörü olarak belirtilir) sayesinde, k sayısının RAM’de tutulduğu adres yazdırılmıştır. İşte pointerler bu k değerinin bulunduğu adresin adını point etmekte, yani belirtmektedirler.

Bir diğer örnekte belirtmek gerekirse,

Mesela integer tipinde bir k verimiz olsun. ve bunun değeri 44 olsun. ve bu 44 değeri Ram’in 1244996.ncı adresinde tutulsun. O zaman ne olur?
k = 44, &k = 1244996

İşte burada pointer devreye giriyor.

k’nın pointerına da pk diyelim ve yine bu integer tipinde bir veri O zaman,

*pk = &k oluveriyor.

Yani bizim pk ismini verdiğimiz Ram hücresinin içindeki sayı, yine ram’de bulunan k isimli hücrenin adresi olmuş oluyor.

İnsanlar kod içerisinde genellikle aynı sayıyı pointer ile belirtiyor. Sanırım genel kafa karışıklığının doğduğu yer burası. Ben söz konusu adresin bulunduğu hücreyi belirten sayıyı kullanmak için adres operatörlü olan verinin adını başka bir isime eşitliyorum. Böyle programın başlangıç kısmında henüz kafam karışmamışken, karmaşa çıkma olasılığını azaltıyorum. Tabi bu birazcık pratikle de gelen birşey🙂

Ekran alıntılarında görünen kaynak kodlarını istiyorsanız bnmle facebook sayfam üzerinden veya blogumun facebook sayfası üzerinden iletişime geçebilirsiniz ve blogumu facebook üzerinden takip edebilirsiniz. Şu an rapidshare vb. bir siteye üyeliğim olmadığı için tek bir link üzerinden sınırsız paylaşım yapamıyorum. 3-5 link birden yapacak vaktim de yok, zira bu satırları yazarken saat çoktan gece yarısını geçmiş durumda😀

edit: aslında buna bile gerek yok, kısacık kodlar zaten, bakarak da yazabilirsiniz. Fakat illede hazır yazılmışını istiyorsanız kaynak kodunu istediğiniz gün içerisinde göndereceğimden kesinlikle emin olabilirsiniz😉

Link

2 Yorum

Filed under C & C++

2 responses to “C Programlama Dili’nde İşaretçi(Pointer) Mantığı

  1. Merhaba
    Ben bilisim sistemleri muhendisliginde 2.sinif ogrencisiyim.Yukarda dediklerinize aynen katiliyorum kitaplarda pointer mantigi anlatilmiyor,Halbuki pointer ve array mantigini cozdugumuzde butun programlama dillerini cozebiliriz.Pointer konusunda hala eksiklerim oldugunu hissediyorum .Bana mantigini cok iyi kavratacak bir site ya da kitap onerebilir misiniz?Bu isin cok pratikle halledilebilecegine inaniyorum.Yardim ederseniz cok sevninirim

    • Timur Aykut YILDIRIM

      Merhabalar Melike,

      Programlama konusunda pratik yaklaşımdan yana olan düşüncelerini bende destekliyorum. Kitap konusuna gelince, yukarıda kullandığım örnekler Schaum’s Outline C++ kitabının pointer örnekleri. C ile aralarındaki farklar temel olarak cout yerine printf kullanmak gibi birşey. Örneklerde o kadar basit ve mantığa yönelikti ki ekstradan bir örnek yazma ihtiyacı hissetmedim.

      Bence her yazar bütün konuları iyi anlatamıyor. Bu yüzden bende temel referans olarak C’nin tasarımcısı olan Dennis Ritchie’nin kitabını önerebilirim. Şuradan indirebilirsin:

      C Programming Language Book

      ayrıca şu siteye bakman da faydalı olabilir:
      http://aelinik.free.fr/c/

      *not: umarım kaynakların ingilizce olması sıkıntı yaratmaz

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Connecting to %s