Pointerlar (101): İşaretçiler Nedir? Bellek Adreslerine Giriş

  • Konbuyu başlatan Konbuyu başlatan irfo
  • Başlangıç tarihi Başlangıç tarihi

irfo

Moderatör
Katılım
7 Ocak 2026
Mesajlar
290
Tepkime puanı
2
Puanları
18

Fotokopi mi, Orijinal mi?​

Go varsayılan olarak "Değer ile Aktaran" (Pass by Value) bir dildir. Yani bir fonksiyona bir değişken gönderdiğinizde, Go o değişkenin bir kopyasını (fotokopisini) oluşturur. Fonksiyon içinde kopyayı değiştirirseniz, orijinal veri değişmez.

Orijinal veriyi değiştirmek veya büyük verileri kopyalayarak RAM'i şişirmemek için Pointer (İşaretçi) kullanırız. Pointer, verinin kendisini değil, verinin RAM'deki adresini tutan bir değişkendir.

İki Sihirli Operatör:​

  • & (Adres Operatörü): Bir değişkenin RAM'deki adresini bulur.
  • * (İşaretçi Operatörü): Adresi bilinen bir değişkenin içindeki değeri okur veya değiştirir (Dereferencing).
Kod:
package main

import "fmt"

func main() {sayi := 10

// "sayi" değişkeninin adresini "p" değişkenine ata<br>var p *int = &amp;sayi <br><br>fmt.Println("Değer:", sayi) // Çıktı: 10<br>fmt.Println("Adres:", p)    // Çıktı: 0xc00001... (Hexadecimal adres)<br><br>// Adresteki değeri okuma<br>fmt.Println("Pointer üzerinden değer:", *p) // Çıktı: 10<br><br>// Adresteki değeri değiştirme<br>*p = 20<br>fmt.Println("Yeni Değer:", sayi) // Çıktı: 20 (Orijinal değişti!)<br>
}

Fonksiyonlarda Kullanımı​

Aşağıdaki örnekte degistir fonksiyonu orijinali etkilemezken, degistirPointer orijinali etkiler.

Kod:
func degistir(val int) {val = 0 // Sadece kopyayı sıfırlar}

func degistirPointer(val *int) {*val = 0 // Orijinal adrese gidip değeri sıfırlar}

func main() {x := 50degistir(x)fmt.Println(x) // 50 (Değişmedi)

degistirPointer(&amp;x) // Adres gönderiyoruz<br>fmt.Println(x) // 0 (Değişti)<br>
}

Sonuç​

Pointer'lar performans ve veri bütünlüğü için kritiktir. Ancak gereksiz yere her yerde pointer kullanmak (özellikle küçük verilerde) işlemciyi yorabilir ve "Garbage Collector" üzerinde baskı oluşturabilir. Dengeli kullanmak gerekir.
 
Geri
Üst