本节学习目标
指针是一种存储变量内存地址(Memory Address)的变量
例如变量 a 的值是123 ,123存储的内存地址为0x123456,则我们定义一个指针类型的变量b,让它的值为0x123456,那么我们去这块物理内存的值时,就能得到123
下面我们用代码演示一下上面的过程
package main
import "fmt"
func main(){
a := 124
fmt.Println(&a) // 查看a的地址
}
image.png
下面我们定义一个指针类型
package main
import "fmt"
func main(){
a := 124
fmt.Println(&a) // 查看a的地址
var b *int = &a
fmt.Println(b)
}
image.png
接下来 我们取地址下面的值
package main
import "fmt"
func main(){
a := 124
fmt.Println(&a) // 查看a的地址
var b *int = &a
fmt.Printf("地址:%x,对应的值为:%d/n",b,*b)
}
image.png
var b *int
fmt.Println(*b)
image.png
指针b执行的地址 是nil,这个时候通过*b去取值,会发生错误如上图,那么我们正确的操作应该怎么办?
package main
import "fmt"
func main(){
var b *int
if(b==nil){
fmt.Println("b是一个空指针")
}else{
fmt.Println(*b)
}
}
image.png
package main
import (
"fmt"
)
func main() {
b := 255
a := &b
fmt.Println(a)
fmt.Println(*a)
}
image.png
怎么通过指针修改b的值呢?
package main
import "fmt"
func main(){
b := 255
a := &b
fmt.Println(a)
fmt.Println(*a)
*a += 5
fmt.Println(b)
}
image.png
import "fmt"
func main(){
array := [3]int{1,2,3}
change(&array)
fmt.Println(array)
}
func change(array *[3]int){
array[1] = 10
}
image.png
注意array[1] = 10,为什么不写成 array[1] = 10? 答:a[x] 是 (a)[x],当然
我们看一种更加优雅的写法
import "fmt"
func main(){
array := [3]int{1,2,3}
change(array[:])
fmt.Println(array)
}
func change(array []int){
array[1] = 10
}
image.png