版权声明:如需转载、粘贴内容,必须在转载和粘贴文中标明文章内容出至 https://blog.csdn.net/ynzcxx/article/details/84784536
指针是存储另一个变量的内存地址的变量。
变量是一种使用方便的占位符,变量都只想计算机的内存地址。
一个指针变量可以指向任何一个值的内存地址
GoLang获取一个变量的地址,在一个变量前使用&符号,会返回该变量的内存地址.
GoLang的指针是不能参与运算的。
声明指针,*T是指针变量的类型,它指向T类型的值。
格式:var 指针变量名 *指针类型(如var ip *int)
在一个指针变量前加上一个*符号,则获取该指针变量真实的值。
来一个例子,获取变量地址:
func getVariableAddr() {
a := 10
fmt.Printf("变量的地址:%x \n", &a)
arr := []int{1, 2, 3, 4, 5}
fmt.Printf("变量的地址:%x \n", &arr)
}
运行后可获得该变量的地址,接着申明指针变量的例子:
func declarePointer() {
//定义一个实际变量
a := 100
//申明一个指针变量
var ip *int
//给指针变量赋值
ip = &a
//获取指针变量的值
fmt.Println(ip)
//获取指针变量内存地址的实际值
fmt.Println(*ip)
}
声明一个复合变量的指针:
先声明一个复合类型:
type student struct {
name string
age int
married bool
sex int8
}
接着来做复合变量的指针:
func complexType1() {
s1 := student{"yoni", 37, true, 1}
s2 := student{"oscar", 35, true, 0}
var a *student = &s1
var b *student = &s2
fmt.Println("\n-------------")
fmt.Printf("S1的类型为%T,值为%v \n", s1, s1)
fmt.Printf("S2的类型为%T,值为%v \n", s2, s2)
fmt.Println("\n-------------")
fmt.Printf("a的类型为%T,值为%v \n", a, a)
fmt.Printf("b的类型为%T,值为%v \n", b, b)
fmt.Println("\n-------------")
fmt.Printf("*a的类型为%T,值为%v \n", *a, *a)
fmt.Printf("*b的类型为%T,值为%v \n", *b, *b)
fmt.Println("\n-------------")
fmt.Println(s1.name, s1.age, s1.married, s1.sex)
fmt.Println(a.name, a.age, a.married, a.sex)
fmt.Println("\n-------------")
fmt.Println((*a).name, (*a).age, (*a).married, (*a).sex)
fmt.Println(&a.name, &a.age, &a.married, &a.sex)
}
空指针的例子:
func nullPointer() {
var pval *int
fmt.Printf("pval指针的类型为%T,值为%v \n", pval, pval)
if pval == nil {
fmt.Println("prval为空指针")
} else {
fmt.Println("pval有指针")
}
}
通过指针改变变量值的例子:
func pointer1() {
a := 10
var b *int = &a
fmt.Printf("b的类型%T,数值%v \n", b, b)
fmt.Println("a的地址", b)
fmt.Println("*b的值", *b)
*b++
fmt.Println("a的值", a)
}
将指针作为函数参数:
func change1() {
a := 10
fmt.Println("调用函数前的A值", a)
b := &a
dochange1(b)
fmt.Println("调用函数后的A值", a)
}
func dochange1(num *int) {
*num = 50
}
将两个值数据互换的例子:
func swap() {
a,b := 100,200
//传统写法
a,b = doSwap1(a,b)
fmt.Println("传统交换后:",a,b)
//指针写法
doSwap2(&a,&b)
fmt.Println("指针交换后:",a,b)
}
func doSwap1(x, y int) (int, int) {
return y, x
}
func doSwap2(x, y *int) {
*x, *y = *y, *x
}
对切片进行指针操作:
func modify() {
arr := []int {1,2,3,4,5}
doModify(&arr)
fmt.Println(arr)
}
func doModify(arr *[]int){
(*arr)[0] = 500
}
对切片指针进行操作,虽然可以用指针来修改,但使用指针不是最好的办法。
指针的指针:
func pointerPointer(){
var a int
var ptr *int
var pptr **int
a = 123
//为指针赋值
ptr = &a
fmt.Println("ptr:",ptr)
//为指针的指针赋值
pptr = &ptr
fmt.Println("pptr:",pptr)
}