Go语言-指针
指针
- 指针是存储另一个变量内存地址的变量
- 取址符号:&
- 获取地址内容 : *
//1、定义一个整数a
a := 10
fmt.Println(a, &a) //10 0xc0000a6058
//2、将a内存地址赋值b
b := &a
fmt.Println(b, &b, *b)//*b:指向a的值 0xc0000a6058 0xc0000ca020 10
//3、将b的值更改
*b = 20
fmt.Println(a, &a) //20 0xc0000a6058
//4.定义一个指针变量
var p *int
p = &a
*p = 20; //为指针变量指向的地址赋值
//5.嵌套指针
var ptr **int //可以将*int看作一个整体
ptr = &p
fmt.Printf("ptr存储的p的地址:%p\t,ptr指向p的值:%d\n", ptr, *ptr) //ptr存储的p的地址:0xc0000ca020 ,ptr指向p的值:824634400856
fmt.Printf("ptr自己的地址:%p\t,ptr取p变量的值为:%d\n", &ptr, **ptr)//ptr自己的地址:0xc0000ca028 ,ptr取p变量的值为:20
(1)指针数组与数组指针
- 数组指针:一个指向数组的指针
- 指针数组:存储数据类型为指针的数组
数组指针
//1、定义一个数组
arr := [4]int{1, 2, 3, 4}
fmt.Printf("arr的内存地址:%p\n", &arr) //arr的内存地址:0xc000012200
//2、定义一个指针,指向数组
var p *[4]int
p = &arr
fmt.Printf("p-->arr的内存地址:%p\n", p) //p-->arr的内存地址:0xc000012200
fmt.Printf("p-->arr的值:%d\n", *p) //p-->arr的值:[1 2 3 4]
fmt.Printf("p自己的地址:%p\n", &p) //p自己的地址:0xc00000a030
//3、将数组的第一、二个元素改变
(*p)[0] = 100
//也可以简写
p[1] = 200
fmt.Printf("p-->arr的值:%d\n", *p) //p-->arr的值:[100 200 3 4]
指针数组
a := 1
b := 2
c := 3
d := 4
arr2 := [4]*int{&a, &b, &c, &d} //定义一个指针数组
fmt.Println(arr2) //[0xc00001c0a8 0xc00001c0d0 0xc00001c0d8 0xc00001c0e0]
fmt.Println(*arr2[0]) //1
*arr2[0] = 100
fmt.Println(*arr2[0]) //100
(2)指针函数
指针函数:返回值为指针的函数
func f1() *[4]int {
arr1 := [4]int{1, 2, 3, 4}
return &arr1
}
(3)指针作为参数
func f2(ptr2 *int) {
fmt.Println("ptr2:", ptr2)
fmt.Println("*ptr2:", *ptr2)
*ptr2 = 100
}