代码:github.com/codeXiaoQia…
1.普通指针
//1.普通指针
var num int = 666;
var value float32 = 13.34
var flag bool = true
//定义指针
var p *int
p = &num
*p = 777
Println(num)
var p1 *float32
p1 = &value
*p1 = 1.777
Println(value)
var p2 *bool
p2 = &flag
*p2 = false
Println(flag)总结:
1.普通指针
Go语言中的普通指针和C语言中的普通指针一样, 通过指针也可以间接操作指向的存储空间
C语言中指针的格式 int *p
Go语言中指针的格式 var p *int2.指向数组的指针
//定义一个数组
var arry [4]int = [4]int{1,2,3,4}
//定义一个指向数组指针
var p *[4]int
//指针指向数组
p = &arry
//打印指针,数组的地址
Printf("arry = %p\n,arry[0] = %p\n, p = %p\n",&arry,&arry[0],p)
//打印结果
//arry = 0xc42008c020
//,arry[0] = 0xc42008c020
//, p = 0xc42008c020
//修改数字值
p[0] = 111
//打印数组
Println(arry)//[111 2 3 4]总结:
2.指向数组的指针
2.1Go语言中指向数组的指针和C语言中指向数组的指针差不多, 通过指针也可以间接操作数组
C语言中指向数组指针的格式 int[3] *p
Go语言中指向数组指针的格式 var p *[3]int
2.2和C语言, 只要一个指针指向数组之后, 就可以通过指针来操作数组
格式: (*p)[0] / p[0]
注意点: C语言中数组名/&数组名/&数组首元素 都是同一个地址
Go语言中&数组名/&数组首元素 都是同一个地址, 但是通过数据名不能直接获取数组的地址
注意点: 在Go语言中只有相同类型的数据才能赋值
注意点: 在Go语言中指向数组的指针不支持+1 -1的操作3.指向切片的指针
//定义一个切片
var sce []string = []string{"zhangsan","lisi","wangwu"}
//定义一个指向切片的指针
var p *[]string
//指针指向切片
p = &sce
//修改切片的值
(*p)[0] = "hhah"
//打印切片的值
Println(sce)
//打印地址
Printf("p = %p\n sce = %p",*p,sce)
//p = 0xc42007a180
//sce = 0xc42007a180总结:
3.指向切片的指针
3.1一定要清楚切片的本质是一个结构体, 结构体中的一个属性是指针, 这个指针指向了底层的一个数组
注意点:
如果一个指针指向了数组, 那么可以通过 (*p)[0]和p[0]来操作指向的数组
但是如果一个指针指向了切片, 只能通过(*p)[0]来操作指向的切片4.指向字典的指针
//定义一个字典
var dict map[string]string
dict = map[string]string{"name":"zhangsan"}
//定义一个指向字典的指针
var p *map[string]string
//给指针赋值
p = &dict
//操作指针
(*p)["name"] = "lisi"
//打印地址
Printf("p = %p, dict = %p, &dict = %p", p, dict,&dict)
//打印结果
//p = 0xc42008e020, dict = 0xc42007e180, &dict = 0xc42008e020总结:
4.指向字典的指针
和普通指针一样, 只能通过(*p)[key]来操作字典5.指向结构体的指针
type Person struct {
name string
age int
}
var per Person = Person{"lnj", 18}
var p *Person
p = &per
//(*p).name = "zs"
p.name = "zs"
fmt.Println(per)总结:
5.指向结构体的指针
和C语言中指向结构体的指针一样, 可以通过(*p).attr和p.attr来操作结构体6.指针作为函数的参数,与返回值
func main() {
num := 124
change(&num)
Println(num)
p := getP()
println(*p)
}
func getP() *int {
num1 := 3
p := &num1
return p
}
func change(p *int) {
*p = 11
}总结:
6.指针作为函数的参数和返回值
6.1指针作为函数的参数和C语言一样, 修改形参会影响实参
6.2指针作为函数的返回值, 如果指针指向的是一个局部变量, 那么不建议返回
因为当函数调用完毕局部变量就释放了