Pointers refer to an existing value so code can read or change it indirectly.

pointer A pointer stores the address of another value. The `*` operator reads or updates the value at that address.

Pointers

amount
pointers_intro.go
Replay: real traced execution (multi-file project)
package main

import "fmt"

func main() {
	var amount = 10
	pointer := &amount
	*pointer = *pointer + 2

	fmt.Println("amount=", amount)
	fmt.Println("pointed=", *pointer)
}
package main

import "fmt"

func main() {
	var amount = 5
	pointer := &amount
	*pointer = *pointer + 2

	fmt.Println("amount=", amount)
	fmt.Println("pointed=", *pointer)
}
package main

import "fmt"

func main() {
	var amount = 20
	pointer := &amount
	*pointer = *pointer + 2

	fmt.Println("amount=", amount)
	fmt.Println("pointed=", *pointer)
}
  1. amount ← 10, pointer ← (*int)(⟨addr A⟩)

    5func main() {6  var amount→ 10 = 10 //@amount=5, 207  pointer→ (*int)(⟨addr A⟩) := &amount108  *pointer = *pointer + 2910  fmt.Println("amount=", amount12)11  fmt.Println("pointed=", *pointer)12}
    outputamount= 12
    pointed= 12
  1. amount ← 5, pointer ← (*int)(⟨addr A⟩)

    5func main() {6  var amount→ 5 = 57  pointer→ (*int)(⟨addr A⟩) := &amount58  *pointer = *pointer + 2910  fmt.Println("amount=", amount7)11  fmt.Println("pointed=", *pointer)12}
    outputamount= 7
    pointed= 7
  1. amount ← 20, pointer ← (*int)(⟨addr A⟩)

    5func main() {6  var amount→ 20 = 207  pointer→ (*int)(⟨addr A⟩) := &amount208  *pointer = *pointer + 2910  fmt.Println("amount=", amount22)11  fmt.Println("pointed=", *pointer)12}
    outputamount= 22
    pointed= 22

Change Through the Pointer

  1. amount starts at 10.
  2. pointer := &amount stores the address of amount.
  3. *pointer reads the value at that address.
  4. *pointer = *pointer + 2 changes amount to 12.
amount: 10
pointer -> amount
after write: amount = 12

Exercise: pointers_intro.go

Take a pointer to an amount, add through the pointer, and print both views