目录
1.初识指针
/*
指针变量:存储变量内存地址的变量
定义格式:
var 指针变量名 *被指向的变量类型
&:取变量的内存地址
*:取指针变量指向地址的值
*/
func main() {
//1.定义普通变量
var a int = 10
fmt.Printf("变量a的值:%d,变量a内存地址的数据类型:%T,变量a的内存地址值:%p\n", a, &a, &a) //变量a的值:10,变量a内存地址的数据类型:*int,变量a的内存地址值:0xc00001c088
//2.定义指针变量
var p *int = &a
fmt.Printf("指针变量p的值:%p,指针变量p对应的数据内容:%d,指针变量p的内存地址值:%p\n", p, *p, &p) //指针变量p的值:0xc00001c088,指针变量p对应的数据内容:10,指针变量p的内存地址值:0xc00000a030
//3.通过指针修改对应变量的内容
*p = 20
fmt.Println(a, *p) //20 20
//4.再定义一个指针变量,指向指针变量p
var ptr **int = &p
fmt.Printf("指针变量ptr的值:%p,指针变量ptr对应的数据内容:%p,指针变量ptr指向的指针变量p指向的变量a的值:%d\n", ptr, *ptr, **ptr) //指针变量ptr的值:0xc00000a030,指针变量ptr对应的数据内容:0xc00001c088,指针变量ptr指向的指针变量p指向的变量a的值:20
//5.通过指针变量ptr修改a的值
**ptr = 30
fmt.Println(a, *p, **ptr) //30 30 30
}
2.数组指针与指针数组
/*
数组指针与指针数组
数组指针:数组类型的指针;格式 *[长度]类型
指针数组:存储指针类型的数组;格式 [长度]*类型
*/
func main() {
//1 数组指针
//1.1 定义一个数组
arr := [...]int{1, 2, 3, 4, 5}
fmt.Printf("数组arr的值:%d,数组arr内存地址的类型%T,数组arr的内存地址%p\n", arr, &arr, &arr)
//1.2 定义一个数组类型的指针,指向数组arr
var p *[5]int = &arr
fmt.Printf("数组指针p的值:%p,数组指针对应的数据内容:%d,数组指针的内存地址%p\n", p, *p, &p)
//1.3 通过数组指针修改数组的值
(*p)[0] = 10
fmt.Println(arr, *p)
//1.4 简化写法 指针指向什么它就是什么
p[0] = 100
fmt.Println(arr, *p)
//2.指针数组
//2.1 定义一些变量
var a, b, c, d int = 9, 8, 7, 6
//2.2 将变量的内存地址存储到指针数组中
var ptr = [4]*int{&a, &b, &c, &d}
//2.3通过指针数组修改变量值
*ptr[0] = 90
fmt.Println(a)
}
3.指针作为函数的参数和返回值
// 指针作为函数的参数
func f1(p *int) {
*p = 10
}
// 指针作为函数的返回值
func f2() *[5]int {
var arr = [5]int{1, 2, 3, 4, 5}
return &arr
}
func main() {
//1.指针作为函数的参数
var a int = 1
f1(&a) //由于传递的是地址值,函数传递基本类型的变量变量a的值也会修改
fmt.Println(a) //10
//2.指针作为函数的返回值
p := f2()
fmt.Printf("指针变量p的值:%p,指针变量p对应的数据内容:%d\n", p, *p) //指针变量p的值:0xc00000e360,指针变量p对应的数据内容:[1 2 3 4 5]
}