Puntatori

Puntatori #

// Go permette l'utilizzo dei <a href="https://it.wikipedia.org/wiki/Puntatore_(programmazione)"><em>puntatori</em></a>,
// che si traduce nell'abilità di passare riferimenti a
// valori all'interno del programma.

package main

import "fmt"

// Dimostreremo come i puntatori funzionino diversamente
// dai valori tramite 2 funzioni: `zeroval` e `zeroptr`.
// `zeroval` ha un parametro di tipo `int`, quindi il
// parametro passato sarà un valore, non un puntatore.
// Quando chiameremo la funzione `zeroval`, il suo
// parametro `ival` verrà copiato da quello della
// funzione chiamante.
func zeroval(ival int) {
    ival = 0
}

// `zeroptr` invece ha un parametro di tipo `*int`, e ciò
// significa che è un puntatore a un `int`. L'istruzione
// `*iptr` nel corpo della funzione permette di
// _dereferenziare_ l'indirizzo di memoria puntato da `iptr` in
// modo da otternere il suo valore. Se si assegna un valore
// ad `*iptr` si va a modificare il valore all'indirizzo di memoria
// puntanto.
func zeroptr(iptr *int) {
    *iptr = 0
}

func main() {
    i := 1
    fmt.Println("iniziale: ", i)

    zeroval(i)
    fmt.Println("zeroval:  ", i)

    // La formula `&i` restituisce l'indirizzo nella memoria
    // di `i`, ovvero un puntatore ad `i`.
    zeroptr(&i)
    fmt.Println("zeroptr:  ", i)

    // Anche i puntatori possono essere stampati.
    fmt.Println("puntatore:", &i)
}
# `zeroval` non cambia il valore di `i` in `main`,
# `zeroptr` invece sì perché ha un riferimento al valore
# nella memoria di quell'indirizzo.
$ go run pointers.go
iniziale:  1
zeroval:   1
zeroptr:   0
puntatore: 0x42131100