Pointer kavramı Türkçe'ye 'işaretçi/imleç' şeklinde çevrilebilir. Kısaca, Pointer, bir değişkenin adresini hafızada tutan, onu işaretleyen bir değişkendir. Örnekleri gördükçe bunu daha iyi algılayacağız.

Yukarıdaki örneğe baktığımızda 'name' adında bir değişken tanımladığımızı ve bunu 'fmt.Println(name)' şeklinde yazdırdığımızı görüyoruz; çıktıya baktığımızda normal bir şekilde 'Cyber Worm' yazısını görüyoruz. Bir alt satırda, kırmızı kutuya baktığımızda ise 'fmt.Scanln()' kullanırken kullandığımız '&' işaretini görüyorsunuz; ne alaka?
Bunun bu şekilde kullanımı aslında bize Pointer kavramını açıklar. Çıktı kısmına baktığınızda '0xc000054250' şeklinde bir adres görüyoruz. Bu, 'name' değişkeninin hafızada tutulduğu adresi ifade eder.
Bir de az önce kendisinin bir değişken olduğundan bahsetmiştik.

Yukarıdaki koda bakalım. 'name' adında sıradan bir değişken oluşturduk. Hemen altına da 'name1 := &name' şeklinde bir kod yazdık. Buradaki amacımız, 'name1' değişkeninin Pointer rolünde olmasını ama 'name' değişkeninin aynı kalmasını istememizdir. Yani bin satır sonra eğer 'name' değişkenini çağırırsanız 'Cyber Worm', 'name1' değişkenini çağırırsanız da 'name' değişkeninin hafızadaki yerini elde edersiniz.
İsterseniz bu değişkenin veri tipini görelim.

'fmt.Printf("%T", &name)' şeklinde bir kod yazdık. Buradaki kodun ne olduğunu kestiriyorsunuzdur ama '%T' bu kurs serisinde ilk defa karşılaştığınız bir şey. Bu ifade bize, değişkenin veri tipini görmemize olanak tanır. Bu kodu çalıştırdığımızda aşağıda 'string' yerine '*string' şeklinde bir ifade görüyoruz. Bu, Pointer gösterimi olarak geçer.
[*] Bundan sonraki kısmı anlaması biraz zordur. Temiz ve sakin bir kafayla okuyun ve lütfen uygulama yapın.
Buraya kadar Pointer mantığını ve '*' sembolünün ne işe yaradığını kavramış olmamız gerekiyor. Şimdi, bu öğrendiklerinizle kolayca anlayabileceğiniz bir sihir yapacağım.

Yukarıdaki koda dikkat edin. İlk kodumuzda (fmt.Println(name)) 'name' değişkenimizin değerini yazdırdık. İkinci kodda (fmt.Println(&name)) Pointer ile adresi yazdırdık. Son olarak (fmt.Println(*(&name))) tekrar normal değerimiz olan 'Cyber Worm' değerini yazdırdık. Burada kullandığımız operatör '*' idi. Bunu, şifreleme olarak düşünebilirsiniz. Önce veriyi hazırlıyoruz (normal değeri verir) sonra şifreliyoruz (adresi verir) son olarak da şifreyi kırıyoruz (tekrar normal değeri verir).
Şimdi Pointer mantığı ile bir fonksiyon oluşturmayı deneyelim. Bu arada bu fonksiyonlara 'Pointer Method' denir.

Yukarı dikkatli bakın ve yeşil yazıları sırasına göre okuyun. Gerekli açıklamaları yeşil yazılarla sağladım fakat number fonksiyonuna bakalım. func number(num *int) şeklinde bir şey yazmışız. Az önce, çıktı kısmında *string diye bir çıktı görmüş ve bunun Pointer olduğundan söz etmiştik. Fonksiyon tanımlarken de aynı mantık ile veri tipinin başına yıldız işaretini koyuyoruz yani *int şeklinde yazıyoruz. Bu kodların çıktısına baktığımızda ilk çıktı normal bir değer olarak geldi fakat ikinci çıktı bir adres olarak geldi. Bu da, 'number(&x)' kodundan kaynaklandı.
Peki, burada eğer 10 değerini ikiyle çarpmak istersek ne yaparız?

15 ve 16. satırlara bakalım; onlar yeni kodlarımız, zaten gerisini biliyorsunuz. 15. satırda aslında *num derken biz, -az önceki mantık ile aynı- adresi geri çevirdik yani adres gösterilirken artık sayının kendisi gösterildi daha sonra *=2 kodu ile bu değeri ikiyle çarptık ve 16. satırda 20 değerini döndürdük.
Peki, main() fonksiyonunda x'i tekrar yazdırmayı denersek x değeri 10 mu yoksa 20 mi olur? Aşağıdaki koda bakmadan önce tahmininizi söyleyin ve doğruluğunu ölçün; sıralamayı biliyorsunuz, basit bir algoritma bilgisi yeterlidir.

Evet; 20 olur. Kafa yormanız ve bir sürü örnek çözmeniz gereken bir konudur.
Öğrendik, güzel fakat bunların amacı nedir? Devasa bir Array düşünün ve bu Array'i kopyalamak istediğinizi düşünün. Sizce bu ne kadar verimli bir hareket olur? Bunun yerine o Array'in Pointer'ını almak daha mantıklı olacaktır. Bu sayede hem Array'in kopyasını almamış olursunuz hem de özgürce kullanabilirsiniz. Bunu sadece Array'ler ile sınırlandırmayın. Az önceki fonksiyon örneğinde de gördüğünüz gibi bir değeri olduğu yerde değiştirebilmek adına Pointer denen kavramı kullanıyoruz.
Yayınlanma Tarihi: 2022-08-18 20:59:30
Son Düzenleme Tarihi: 2022-08-20 22:29:59