C++ Pointer Konusu ve Çalışma Mantığı [C++ İşaretçiler Konu Anlatımı]

Yazar:



C yada C++ dillerini yeni öğreniyorsanız yada ilk defa bir programlama dili öğreniyorsanız pointer mantığını anlamakta biraz zorlanabilirsiniz. Yeni başlayanlar için kavraması biraz karmaşık olduğundan bu konuyu ele almak istedim. Bu yazıdan sonra artık pointer kavramının mantığını kolaylıkla kavrayacağınızı düşünüyorum.

Pointer dediğimiz şey bir işaretçidir ve adres tutar. Bu klasik tanımdır. Pointer olarak tanımlayacağımız ifadenin başına yıldız(*) işareti koyarak "bu ifade bir pointer ifadedir" deriz bilgisayara. Mesela;

int p;
olarak tanımladığımız bir ifadede p ifadesi integer yani sayısal değerler tutan bir ifadedir deriz. Sadece sayısal değerleri tutar. Fakat bu ifadeyi şu şekilde tanımladığımız zaman;

int *p;

bu p ifadesi için şunu demiş oluruz :  "p ifadesi bir pointer'dır. p ifadesi bir işaretçidir ve sadece adres tutar!"

Tırnak içinde belirttiğim cümleye dikkat edin. "p ifadesi" dedim. "*p" ifadesi demedim. İşte asıl karmaşıklık burada başlıyor.

*p ifadesi tanımlama ve kullanım aşamalarında farklı görevler üstlenir. Eğer ki siz herhangi bir ifadeye "bu ifade bir pointer'dır!" demek istiyorsanız tanımlama aşamasında o ifadenin başına yıldız (*) ifadesini eklersiniz.

Önce tanımlama aşamasından başlayalım anlatmaya...
Birkaç örnek vermem gerekirse,

int *a;  // "a" ifadesi bir pointer'dır ve adres tutar.
int *ptr;  // "ptr" ifadesi bir pointer'dır ve adres tutar.
int *b;  // "b" ifadesi bir pointer'dır ve adres tutar.

tanımlama aşamasında kullandığımız her yıldızlı(*) ifade bu anlamlara gelir.

Pointer olarak tanımlanmış ifadeyi kullanım aşamasında ise yıldızlı(*) ifade değer tutan bir ifade görevindedir. (Kullanım aşamasında derken, tanımlama sonrası değer atama veya ekrana yazdırma işlemleri vs.)

*a  ifadesi değerin kendisini tutar; a ifadesi ise o değerin adres bilgisini içerir.
*ptr  ifadesi değerin kendisini tutar; ptr ifadesi ise o değerin adres bilgisini içerir.
*b  ifadesi değerin kendisini tutar; b ifadesi ise o değerin adres bilgisini içerir.

Örnek : ptr ifadesinin değeri 5 ise; bu ifadenin adresi : 0x7ffd084 gibisinden, RAM bölgesindeki adresi gösterir.

Kısacası, kullanım aşamasında, pointer bir ifade var ise elimizde, bu ifadenin başında yıldız var ise değerin kendisi gösterilir, başında yıldız yok ise değerin adresini gösterir.

Yani bunun çıktısını cout ile aldığımız zaman;
*ptr ifadesi ekrana = 5 değerini gösterir.
ptr ifadesi ekrana = 0x7ffd084 değerini gösterir.

 Bakınız :


Ekran görüntüsünün açıklaması :
"p" ifadesi adres tutan bir ifade olduğu için, ona yalnızca başka bir ifadenin adresi atanabilir. Mesela üstteki ekran görüntüsüne göre p = a yapamazdık. Yani a ifadesini p ifadesine atarsak hata alırız. Çünük a, 5 e eşittir. Halbuki p ifadesi değer değil adres tutar. O yüzden de a'nın adresini p'ye atamamız gerekiyor. Herhangi bir ifadenin de adres bilgisine anpersan(&) ifadesiyle ulaşılır.

p = &a;

yaparak biz, a'nın adresini p'ye atadık. a'nın adresi derken biz aslında 5 değerinin bilgisayar hafızasındaki adresinin bulunduğu yeri p'ye atadık. p ifadesi de artık aynı adrese sahip olduğu için; *p ifadesi bize 5'i verecektir. Yani p bize 5'in adresini ve *p bize adresin sahip olduğu değeri verir.

Son olarak şu ekran görüntüsü aklınızda bazı şeylerin daha da netleşmesini sağlayacaktır diye düşünüyorum :


Pointer konusunun mantığı budur. Eğer aklınıza takılan yerler var ise, alt kısma yorum olarak yazabilirsiniz. Size elimden geldiğince yardımcı olmaya çalışırım.

31 yorum:

  1. Eline sağlık.En etkkili pointer anlatımını yapmıssın.

    YanıtlaSil
    Yanıtlar
    1. Güzel yorumunuz için teşekkür ederim. Her zaman beklerim. :)

      Sil
  2. Bir turlu oturtamadigim pointerlar konusunda Cok aciklayici bir anlatim olmus. Sanirim bu sefer oldu. Tesekkurler.

    YanıtlaSil
  3. Faydalı bilgiler için teşekkürler. Ancak yanlış hatırlamıyorsam birkaç adet bilgi daha olması lazım. Sadece aklımda kalan tanım/ifade şeklinde;

    int * p;
    int* p;
    int *p;

    Saygılarımla, Enis Ciftci

    YanıtlaSil
    Yanıtlar
    1. Belirttiğiniz 3 farklı kullanım da aynı görevi görüyor ve aynı şeyi ifade ediyorlar.

      Sil
  4. Hayatımda karşılaştığım belki de ennn muhteşem anlatım tarzı. Çoook teşekkürler...

    YanıtlaSil
    Yanıtlar
    1. Güzel yorumunuz için ben teşekkür ederim. Faydalı olabildiğime sevindim. :)

      Sil
  5. Java biliyorum ama c++ da öğrenmek istiyorum.
    Javadan önemlifarklari nedir nasil daha kolay ogrenirim.Bu arada emeğinize sağlık.Çok açıklayıcı olmuş.

    YanıtlaSil
    Yanıtlar
    1. Yorumun için teşekkür ederim. Bir dili bilen biri diğer dilleri öğrenmekte pek zorluk çekmez. Java'da kod yazmak ve geliştirmek daha kolaydır. C++ ile biraz daha zordur ama makine diline daha yakın olduğu için çoğu zaman Java'dan daha hızlı çalışır. Daha çok arka plan uygulamarı üzerine çalışacaksan C++ çok iyidir. Arayüz gerektiren uygulamalar geliştirmek istersen Java ve C# daha çok kolaylık sağlar bu konuda sana. Birazda yapacağın işe bağlı. Belli bir program geliştirmek için değil de sadece bilgin olması açısından öğreniyorsan eğer, zorlanacağını sanmam. Çünkü zaten öncesinde bildiğin bir dil varmış. Öğrendikçe Java'dan hangi yönleriyle farklı göreceksin zaten.

      Ayrıca, nasıl çabuk öğrenirim demişsin. C++'ı genel hatlarıyla öğrendikten sonra ufak bir kaç uygulama geliştirebilirse eğer, C++'ı daha çabuk kavrayabilirsin. Bu durum sadece C++'a özgü bir şey değil tabi. Tüm programlama dilleri için geçerli bir durumdur.

      Sil
  6. Gerçekten güzel bir tanımlama olmuş hocam elinize sağlık.Ben bir soru sormak istiyorum linkedlist de pointerlar kullanılmakta bunu bir nevi pointer döngüsü olarak algılayabilirmiyiz her bir veri başka bir noktaya point ettiği için biraz anlamakta güçlük çekmekteyim.Demek istediğim sürekli bir adres atamasımı var adres dögüsü olarak adlandırabiliriz belki bunu umarım açıklayıcı olmuşumdur

    YanıtlaSil
    Yanıtlar
    1. Pointer olayında her adres bir değeri işaret eder. Veri yapılarında kullanılan bağlı listeler konusundaki mantık daha farklı. Orada bir düğüm var ve her düğüm hem kendi değerini hem de de sonraki verinin adresini taşır. Normal bir pointerda ise, pointer'ın işaret ettiği adres, o adrese ait olan değeri gösterir.

      Bağlı listeler ile ilgili sitede bir yazım var. Bağlı listeler konusunu incelemek için şu linke tıklayabilirsin : http://www.blogkafem.net/2014/01/tek-yonlu-bagli-listeler.html

      Sil
  7. çok iyi bir anlatım olmuş tşkler

    YanıtlaSil
  8. Gerçekten mükemmel anlatmışsınız. Teşekkürler emeğinize sağlık :)

    YanıtlaSil
  9. Muhteşemsin,günlerdir anlamaya uğraşıyorum senin sayende öğrendim.

    YanıtlaSil
  10. sen admasın . anlamadım bir noktayı çok güzel anlatmışsınız. Fakat diğer anlamadığım şey bir pointerı başka bir fonksiyonun içinde nasıl kullanacağımız ? bu konudada yardımcı oldunmu bulamıyorum karşılığında nedesem yani o derece

    YanıtlaSil
    Yanıtlar
    1. Normal değişkeni gönderir gibi, Pointer'ı da parametre olarak gönderebilirsin.

      Sil
  11. gerçekten en anlaşılır anlatım

    YanıtlaSil
  12. Güzel yorumlarınız için hepinize teşekkür ederim arkadaşlar. Hazırladığım içeriğin faydalı olabilmesine sevindim.

    YanıtlaSil
  13. Baktığım onlarca kaynaktan en iyi anlatanlar arasındasın arkadaşım. Sanırım göstericilerle kafayı bozdum :D ama hala içime sinmedi bilgim...

    YanıtlaSil
  14. Anlatımınız çok sade biraz daha farklı kullanım ve örneklerle açabilirseniz çok yardımı dokunur.

    YanıtlaSil
  15. Ebru Çakıltaşı30 Kasım 2016 12:24

    Teşekkürler çok güzel anlatım

    YanıtlaSil
  16. Sonuçta adamın soyadı arslan öğretmek genlerinde var 😀😀

    YanıtlaSil
  17. Peki ben şeyi sorucam **p olursa ne oluyor?

    YanıtlaSil
    Yanıtlar
    1. **p'nin anlamı, bir işaretçiyi belirten başka bir işaretçidir.

      Örneğin *ptr1 bir pointer diye tanımlarsak, bu pointer değerinin adresini **p'ye atayabiliriz. Böylece **p aslında *ptr'nin adresini tutmuş oldu.

      Konuyla ilgili detaylı ve güzel bir anlatım buldum senin için. Aşağıdaki linke tıklayarak konuya gidebilirsin :

      https://www.quora.com/What-is-the-difference-between-*p-**p-***p-in-pointers/answer/Arundhati-Kanungo

      Sistem senden giriş yapmanı isterse, sayfayı bir kez yenilemen yeterli. Yani, linke tıkladıktan sonra sisteme giriş yapmadan da içeriği görebilirsin.

      Sil
  18. p=&a dediğimizde cout<<p; yaparsak output adresi gösteriyor.
    *p=&a dersek cout<<*p; yaparsak output adrese mi eşit olacak yoksa değere mi?

    YanıtlaSil
    Yanıtlar
    1. Kodu kendin derleyip, sonuçlarını kendin görürsen bu senin için daha öğretici olur. :)

      Sil
  19. gerçekten güzel bir anlatım olmuş çok teşekkür ederim

    YanıtlaSil
  20. Yazının faydalı olmasına sevindim arkadaşlar. Size yardımcı olabildiysem ne mutlu bana

    YanıtlaSil
Yorum Sayfası :


Yorum formuna konuyla ilgili görüş ve sorularınızı bırakabilirsiniz.

Yorumunuza mümkün olan en kısa sürede dönüş yapılacağından emin olabilirsiniz.


Eklenen yorumlar, moderatör onayından sonra yayınlanmaktadır.

BLOGKAFEM.NET © Copyright 2008-2023
Sitedeki yazıların her hakkı BLOGKAFEM.NET sitesine aittir.
Kopyalanması halinde lütfen kaynak gösteriniz.
DMCA.com Protection Status
Anasayfa | Hakkında | İletişim