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.
Eline sağlık.En etkkili pointer anlatımını yapmıssın.
YanıtlaSilGüzel yorumunuz için teşekkür ederim. Her zaman beklerim. :)
SilBir turlu oturtamadigim pointerlar konusunda Cok aciklayici bir anlatim olmus. Sanirim bu sefer oldu. Tesekkurler.
YanıtlaSilYardımcı olabildiğime sevindim. :)
SilFaydalı 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;
YanıtlaSilint * p;
int* p;
int *p;
Saygılarımla, Enis Ciftci
Belirttiğiniz 3 farklı kullanım da aynı görevi görüyor ve aynı şeyi ifade ediyorlar.
SilHayatımda karşılaştığım belki de ennn muhteşem anlatım tarzı. Çoook teşekkürler...
YanıtlaSilGüzel yorumunuz için ben teşekkür ederim. Faydalı olabildiğime sevindim. :)
SilJava biliyorum ama c++ da öğrenmek istiyorum.
YanıtlaSilJavadan önemlifarklari nedir nasil daha kolay ogrenirim.Bu arada emeğinize sağlık.Çok açıklayıcı olmuş.
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.
SilAyrı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.
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ıtlaSilPointer 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.
SilBağ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
çok iyi bir anlatım olmuş tşkler
YanıtlaSilGerçekten mükemmel anlatmışsınız. Teşekkürler emeğinize sağlık :)
YanıtlaSilMuhteşemsin,günlerdir anlamaya uğraşıyorum senin sayende öğrendim.
YanıtlaSilsen 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ıtlaSilNormal değişkeni gönderir gibi, Pointer'ı da parametre olarak gönderebilirsin.
Silgerçekten en anlaşılır anlatım
YanıtlaSilGüzel yorumlarınız için hepinize teşekkür ederim arkadaşlar. Hazırladığım içeriğin faydalı olabilmesine sevindim.
YanıtlaSilBaktığı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ıtlaSilAnlatımınız çok sade biraz daha farklı kullanım ve örneklerle açabilirseniz çok yardımı dokunur.
YanıtlaSilTeşekkürler çok güzel anlatım
YanıtlaSilSonuçta adamın soyadı arslan öğretmek genlerinde var 😀😀
YanıtlaSilPeki ben şeyi sorucam **p olursa ne oluyor?
YanıtlaSil**p'nin anlamı, bir işaretçiyi belirten başka bir işaretçidir.
SilÖ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.
p=&a dediğimizde cout<<p; yaparsak output adresi gösteriyor.
YanıtlaSil*p=&a dersek cout<<*p; yaparsak output adrese mi eşit olacak yoksa değere mi?
Kodu kendin derleyip, sonuçlarını kendin görürsen bu senin için daha öğretici olur. :)
SilGüzel anlatım
YanıtlaSilgerçekten güzel bir anlatım olmuş çok teşekkür ederim
YanıtlaSilhelal admin
YanıtlaSilYazının faydalı olmasına sevindim arkadaşlar. Size yardımcı olabildiysem ne mutlu bana
YanıtlaSil