CodeBlanks Logo Icon CodeBlanks

Özet - Pointer

& ve * ile bir sayaç artıran fonksiyon yazarsın.

Pointer özeti

&x adres alır, *p adresteki değeri okur/yazar, *T işaretçi türüdür, sıfır değeri nil'dir. İşaretçiler değiştirme ve büyük değerleri kopyalamadan paylaşma içindir; new(T) ya da &T{...} ile oluşturulur; nil kontrolü unutulmamalıdır. Go'da işaretçi aritmetiği yoktur ve yerel değişkenin adresini döndürmek güvenlidir.

Bağlı liste örneği

İşaretçilerin klasik kullanımı birbirine bağlı düğümlerdir:

type Dugum struct {
    Deger int
    Sonraki *Dugum
}

bas := &Dugum{1, &Dugum{2, &Dugum{3, nil}}}
for d := bas; d != nil; d = d.Sonraki {
    fmt.Print(d.Deger, " ")
}
// 1 2 3

Son düğümün Sonraki alanı nil'dir; döngü nil'e ulaşınca biter.

Uygulama Bağlı liste toplamı

Yukarıdaki Dugum türünü yaz. 1 → 2 → 3 → 4 listesini oluştur ve bir döngüyle değerlerin toplamını hesaplayıp yazdır.

Başlangıç kodu

main.go
package main

import "fmt"

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
package main

import "fmt"

type Dugum struct {
    Deger   int
    Sonraki *Dugum
}

func main() {
    bas := &Dugum{1, &Dugum{2, &Dugum{3, &Dugum{4, nil}}}}
    toplam := 0
    for d := bas; d != nil; d = d.Sonraki {
        toplam += d.Deger
    }
    fmt.Println(toplam)
}

Beklenen çıktı

10

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Bir dilimi fonksiyona verip içinde <code>s[0] = 9</code> yaparsan çağırandaki dilim değişir mi?

  • Evet; dilim alttaki diziyi paylaşır, işaretçi gerekmez Doğru cevap
  • Hayır, kopya alınır
  • Yalnızca *[]int ile
  • Derlenmez

Açıklama: Dilim başlığı kopyalanır ama aynı diziyi gösterir; eleman değişikliği görünür. append ile uzunluk değişikliği ise görünmez.

2 Sonraki düğüm

Soru
for d := bas; d != nil; d = d.____ {
    toplam += d.Deger
}
Cevap
for d := bas; d != nil; d = d.Sonraki {
    toplam += d.Deger
}

Açıklama: d = d.Sonraki bir sonraki düğüme geçer.

3 Grubun özeti

Kavram Anlamı
&x Adres
*p Değer
new(T) Sıfır değerli ayırma
nil Değer yok

Başlangıç bölümündeki tüm dersler