指针
指针是存储另一个变量的内存地址的变量。 例如: 变量B的值为100, 地址为0x1122。变量A的值为变量B的地址0x1122,那么A就拥有了变量B的地址,则A就成为指针。Go语言中通过&获取变量的地址。通过* 获取指针所对应的变量存储的数值。
package main
import "fmt"
func main() {
// 定义一个变量
a := 10
fmt.Printf("a的地址是:%p\n", &a) // a的地址是:0xc00000a0b8
// 创建一个指针
// 指针的声明 通过*T 标识T类型的指针
var i *int // int类型指针
var f *float64 // float64类型指针
fmt.Println(i) // <nil>
fmt.Println(f) // <nil>
// 因为指针存储的是变量的地址,所以指针存储值
i = &a
fmt.Println(i) // 0xc00000a0b8
fmt.Println(*i) // 10
*i = 100
fmt.Println(*i) // 100
fmt.Println(a) // 100
// 通过对 *i 赋另一个值来更改 “对象”,这样 a 也会随之更改。
}
数组指针
数组指针,是一个指向数组,存储数组的地址。
package main
import "fmt"
func main() {
// 创建一个普通数组
arr := [3]int{1, 2, 3}
fmt.Println(arr) // [1 2 3]
// 创建一个指针,用来存储数组的值
var p *[3]int
p = &arr // 将数组arr的地址,存储到数组指针p上。
fmt.Println(p) // &[1 2 3]
// 获取数组指针中的具体数据,和数组指针自己的地址
fmt.Println(*p) // [1 2 3]
fmt.Println(&p) // 0xc00000a0b8
// 修改数组指针中的数据
(*p)[0] = 100
fmt.Println(arr) // [100 2 3]
// 简化写法
p[1] = 200
fmt.Println(arr) // [100 200 3]
}
指针数组
其实就是一个普通数组,只是存储数据类型是指针。
package main
import "fmt"
func main() {
// 定义4个变量
a, b, c, d := 1, 2, 3, 4
arr1 := [4]int{a, b, c, d}
arr2 := [4]*int{&a, &b, &c, &d} // 将所有变量的指针,放进arr2里面
fmt.Println(arr1) // [1 2 3 4]
fmt.Println(arr2) // [0xc00000a0b0 0xc00000a0b8 0xc00000a0c0 0xc00000a0c8]
// 修改arr1中的值
arr1[0] = 100
fmt.Println("arr1的值:", arr1) // arr1的值: [100 2 3 4]
fmt.Println("a=", a) // a= 1
// 修改arr2中的值
*arr2[0] = 200
fmt.Println("arr2的值:", arr2) // arr2的值: [0xc00000a0b0 0xc00000a0b8 0xc00000a0c0 0xc00000a0c8]
fmt.Println("a=", a) // a= 200
// 循环数组,用*取数组中的所有值
for i := 0; i < len(arr2); i++ {
fmt.Println(*arr2[i])
}
}
指针函数
如果一个函数返回结果是一个指针,那么这个函数就是一个指针函数。
package main
import "fmt"
func main() {
// 函数默认为指针,不需要用*号
a := fun1
fmt.Println(a) // 0x10a0e60
a1 := fun1()
fmt.Printf("a1的类型:%T,a1的地址是%p 数值为%v \n", a1, &a1, a1) // a1的类型:[]int,a1的地址是0xc00000a0b8 数值为[1 2 3]
a2 := fun2()
fmt.Printf("a2的类型:%T,a2的地址是%p 数值为%v \n", a2, &a2, a2) // a2的类型:*[]int,a2的地址是0xc00000a0c0 数值为[1 2 3]
fmt.Printf("a2的地址:%p\n", a2) // a2的地址:0xc00000a0b8
}
// 一般函数
func fun1() []int {
c := []int{1, 2, 3}
return c
}
// 指针函数,返回指针
func fun2() *[]int {
c := []int{1, 2, 3}
fmt.Printf("c的地址:%p\n", &c) // c的地址:0xc00000a0b8
return &c
}
指针参数
package main
import "fmt"
func main() {
s := 10
fmt.Println(s) // 10
fun10(&s)
fmt.Println(s) // 100
}
// 接收一个int类型的指针作为参数
func fun10(a *int) {
// 通过指针修改值
*a = 100
}