Menu
Coddy logo textTech

Concetti base dei puntatori in Go

Fa parte della sezione Programmazione orientata agli oggetti del percorso GO di Coddy. Lezione 19 di 107.

Un puntatore è una variabile che memorizza l’indirizzo di memoria di un’altra variabile. Invece di contenere direttamente un valore, contiene la posizione in cui quel valore si trova in memoria. I puntatori sono fondamentali in Go ed essenziali per manipolare i dati in modo efficiente.

Per creare un puntatore, usa l'operatore & per ottenere l'indirizzo di una variabile e l'operatore * per dichiarare un tipo puntatore o accedere al valore a quell'indirizzo.

x := 42
p := &x  // p contiene l'indirizzo di memoria di x

fmt.Println(p)  // 0xc000018030 (indirizzo di memoria)
fmt.Println(*p) // 42 (valore a quell'indirizzo)

L'operatore & significa «indirizzo di» e restituisce un puntatore. L'operatore *, quando viene usato su un puntatore, significa «valore in» ed è chiamato dereferenziazione. Puoi anche modificare il valore originale tramite il puntatore.

x := 10
p := &x

*p = 25         // cambia el valor mediante el puntero
fmt.Println(x)  // 25 (la variable original cambió)

Il tipo puntatore si scrive come *T, dove T è il tipo a cui punta. Un puntatore a un int ha tipo *int.

var p *int      // dichiara un puntatore a int
x := 100
p = &x          // p ora punta a x

Il valore zero di un puntatore è nil, ovvero non punta a nulla. Il tentativo di dereferenziare un puntatore nil causa un panic in fase di esecuzione, quindi assicurati sempre che i puntatori siano inizializzati prima di usarli.

challenge icon

Sfida

Facile

Costruiamo una semplice funzione per scambiare valori, che dimostra la potenza dei puntatori nel modificare le variabili tramite i loro indirizzi di memoria.

Organizzerai il codice in due file:

  • swap.go: Crea una funzione chiamata SwapValues che accetta due puntatori *int come parametri. Questa funzione deve scambiare i valori a cui puntano questi puntatori; dopo averla chiamata, ciascuna variabile deve contenere il valore originale dell'altra. La funzione non restituisce nulla; modifica direttamente i valori tramite i puntatori.
  • main.go: Leggi due numeri interi dall'input, memorizzali in variabili, quindi usa la tua funzione SwapValues per scambiarne i valori. Stampa entrambi i valori prima e dopo lo scambio per mostrare il cambiamento.

Verranno forniti i seguenti input:

  • Riga 1: Primo numero intero
  • Riga 2: Secondo numero intero

Formato dell'output:

Before: a=[first] b=[second]
After: a=[first] b=[second]

Ad esempio, dati 10 e 25, il tuo output dovrebbe essere:

Before: a=10 b=25
After: a=25 b=10

Ricorda di usare l'operatore & quando passi le variabili alla funzione e l'operatore * all'interno della funzione per accedere ai valori effettivi e modificarli.

Provalo tu

package main

import "fmt"

func main() {
	// Leggi due numeri interi dall'input
	var a, b int
	fmt.Scanln(&a)
	fmt.Scanln(&b)

	// Stampa i valori prima dello scambio
	fmt.Printf("Before: a=%d b=%d\n", a, b)

	// TODO: Chiama la funzione SwapValues con puntatori a a e b
	// Ricorda di usare l'operatore & per passare gli indirizzi

	// Stampa i valori dopo lo scambio
	fmt.Printf("After: a=%d b=%d\n", a, b)
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore Go online