Collections and Composite Types
Pointers
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
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)
}
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
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
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
amountstarts at10.pointer := &amountstores the address ofamount.*pointerreads the value at that address.*pointer = *pointer + 2changesamountto12.
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