Golang数据类型之指针
目录
1、概述
2、声明
3、空指针
4、用指针修改值
5、指针的指针
1、概述
每个变量在内存中都有对应的存储位置,也就是内存地址
指针类型是指变量存储的是一个内存地址的变量类型,在golang
中可以通过&
运算符获取变量的指针
取变量指针的语法
ptr := &v // v的类型为T
// v:代表被取地址的变量,类型为T
// ptr:用于接收地址的变量,ptr的类型就为*T,称做T的指针类型。*代表指针
2、声明
指针声明需要指定存储地址中对应数据的类型,并使用*
作为类型前缀进行指针取值
func main() {
//指针取值
a := 10
b := &a // 取变量a的地址,将指针保存到b中
fmt.Printf("type of b:%T\n", b)
c := *b // 指针取值(根据指针去内存取值)
fmt.Printf("type of c:%T\n", c)
fmt.Printf("value of c:%v\n", c)
}
/*
type of b:*int
type of c:int
value of c:10
/*
用法归纳
对变量进行取地址 (&)
操作,可以获得这个变量的指针变量对指针变量进行取值 (*)
操作,可以获得指针变量指向的原变量的值指针变量的值是变量的内存地址
3、空指针
指针变量声明后会被初始化为nil
,表示的是空指针
func main() {
var p *string
fmt.Println(p)
fmt.Printf("p的值是%v\n", p)
if p != nil {
fmt.Println("非空")
} else {
fmt.Println("空值")
}
}
还可以使用new
函数进行初始化,new
函数会根据数据类型申请内存空间并使用零值填充,并返回申请的空间地址
var a *int = new(int)
fmt.Println(&a)
fmt.Println(a) // 0xc000014330
fmt.Println(*a) // 0
// 变量的地址 指针的地址 指针的值
4、用指针修改值
exchange
函数依次进行的操作:
取
c
指针的值, 赋给临时变量t
取
d
指针的值, 赋给c
指针指向的变量将
c
指针的值赋给d
指针指向的变量
func exchange(c, d *int) {
t := *c
*c = *d
*d = t
}
func main() {
a, b := 6, 8 // 准备两个变量, 赋值6和8
exchange(&a, &b) // 交换变量值
fmt.Println(a, b) // 输出变量值
}
/*
8 6
*/
5、指针的指针
用来存储指针变量地址的变量叫做指针的指针
func main() {
var a int
var ptr *int
var pptr **int
a = 3000
/* 指针 ptr 地址 */
ptr = &a
/* 指向指针 ptr 地址 */
pptr = &ptr
/* 获取 pptr 的值 */
fmt.Printf("变量 a = %d\n", a )
fmt.Printf("指针变量 *ptr = %d\n", *ptr )
fmt.Printf("指向指针的指针变量 **pptr = %d\n", **pptr)
}
/*
变量 a = 3000
指针变量 *ptr = 3000
指向指针的指针变量 **pptr = 3000
/*
多维指针
func main() {
var a ****int
v := 10
p1 := &v // *int
p2 := &p1 // **int
p3 := &p2 // ***int
a = &p3 // ****int
fmt.Println(v, p1, p2, p3, a, ****a) // 10 0xc000114168 0xc00011e028 0xc00011e030 0xc00011e038 10
}
See you ~
评论