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

Odpoveď od AI

V tomto kóde existujú dve funkcie, ktoré prijímajú ukazovateľ na int, ale fungujú odlišne:

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

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

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

Vysvetlenie:

  • V updateV1 je parameter px miestna kópia ukazovateľa. Priradenie px = &x2 mení iba túto miestnu kópiu, neovplyvňuje premennú x v main.
  • V updateV2 je dereferencovanie ukazovateľa *px = 20, čo znamená, že sa zmení hodnota na adrese, na ktorú ukazuje px. To zmení hodnotu x v main.

Výsledok: updateV1 nemení pôvodnú premennú, zatiaľ čo updateV2 áno.

Toto demonštruje rozdiel medzi zmenou lokálnej kópie ukazovateľa a zmenou hodnoty na adrese, na ktorú ukazuje.