Sobes.tech
Senior

func updateV1(px *int) { x2 := 20 px = &x2 } func updateV2(px *int) { *px = 20 } func main() { x := 10 updateV1(&x) fmt.Println(x) updateV2(&x) fmt.Println(x) }

sobes.tech AI

Odpowiedź od AI

W tym kodzie są dwie funkcje, które przyjmują wskaźnik na int, ale działają inaczej:

func updateV1(px *int) {
    x2 := 20
    px = &x2
}

func updateV2(px *int) {
    *px = 20
}

func main() {
    x := 10
    updateV1(&x)
    fmt.Println(x) // Wypisze 10
    updateV2(&x)
    fmt.Println(x) // Wypisze 20
}

Wyjaśnienie:

  • W updateV1, parametr px jest lokalną kopią wskaźnika. Przypisanie px = &x2 zmienia tylko tę lokalną kopię, nie wpływa na zmienną x w main.
  • W updateV2, dereferencja wskaźnika *px = 20 zmienia wartość pod adresem, na który wskazuje px. To zmienia wartość x w main.

Wynik: updateV1 nie zmienia oryginalnej zmiennej, a updateV2 tak.

To pokazuje różnicę między zmianą lokalnej kopii wskaźnika a zmianą wartości pod adresem, na który wskazuje.