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.





Hey!

Blogkafem'de okuduğunuz içeriklerle ilgili kişisel Twitter hesabım üzerinden benimle iletişme geçmek isterseniz Twitter adresim : www.twitter.com/aliarslan10

Sosyal medya hesabım dışında Blogkafem'de okumuş olduğun içerik ile ilgili belirtmek istediklerinizi aşağıdaki yorum formuna yazabilirsin. En kısa sürede dönüş yapacağımdan emin olabilirsin. :)

Okuduğunuz içerik faydalı olduysa #blogkafem etiketiyle okuduğunuz içeriğin linkini Twitter'da paylaşarak Blogkafem'e destek olabilirsiniz.

23 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
    Yanıtlar
    1. Yardımcı olabildiğime sevindim. :)

      Sil
  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
Yorum Sayfası :



Yorum yaparken dikkat edilmesi gerekenler;

1. Yorum Formunu doldurduktan sonra Profil Seç -> ADI/URL bölümünden isminizi yazıp yorum yaparsanız size karşı bir hitap şeklimiz olur. (URL kısmını boş bırakabilirsiniz.)

2. Anonim olarak yaptığınız yorumlar "Adsız" olarak gözükmektedir.

3. Türkçe yazım ve dilbilgisi kurallarına uymaya özen gösteriniz.

4. Küfür,hakaret,mail adresi veya konu ile ilgisi olmayan reklam amaçlı website adresi içeren yorumlar yayınlanmamaktadır.

Custom Search

Kafemizde En Son Kim, Ne Demiş?

Kafeyi Dikizleyenler :)

Blog Istatistik

BLOGKAFEM.NET

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