什么是指针
指针就是地址,指针变量就是存储地址的变量。 使用”%q"打印go语言带双引号的字符串,可以显示出空结果;%s与Println一样的结果
指针使用注意:
空指针:未初始化的指针。var p *int
野指针:用一片无效的地址空间来初始化
指针初始化:
使用new(type)函数初始化,默认为类型的默认值,在heap上申请一段空间;
使用&取地址运算符;
指针传参:值传递
传引用:将地址值作为函数参数,返回值传递。
传值:将实参的值拷贝一份给形参。
*p是解引用,或者称为间接引用 ,a是一个整型变量,p是一个整型指针变量,&a存的是a当前空间的地址,&p存的是p当前空间的地址,&是取地址运算符,返回的是操作数的内存地址;但是p存的是a的地址,*是间接寻址运算符,返回的是操作数所指定地址的变量的值。
初识指针
func main() {
var a int = 10
var b = &a
fmt.Println("a的值为", a)
fmt.Println("a的内存地址为", &a)
fmt.Println("b的值为", b)
//*指针
fmt.Println("变量b指向内存地址中存储的数据", *b)
*b = 20
fmt.Println(a, *b)
}
指针的使用
func main() {
var a int = 10
fmt.Println(a)
fmt.Println("a的内存地址", &a)
//声明一个指针变量
var p *int
p = &a
fmt.Println(&a)
fmt.Printf("p 变量储存的指针地址:%p\n", p)
fmt.Printf("p 变量的地址%p\n", &p)
*p = 20
fmt.Println(a)
//在定义一个指针变量ptr ,来指向 指针变量p
var ptr **int
ptr = &p
fmt.Printf("ptr 变量储存的指针地址:%p\n", ptr)
fmt.Printf("ptr 变量自己的地址%p\n", &ptr)
fmt.Printf("*ptr变量的值 %p\n", *ptr)
fmt.Printf("*ptr 变量的地址的值%d\n", **ptr)
}
10
a的内存地址 0xc00001a0a8
0xc00001a0a8
p 变量储存的指针地址:0xc00001a0a8
p 变量的地址0xc00000a030
20
ptr 变量储存的指针地址:0xc00000a030
ptr 变量自己的地址0xc00000a038
*ptr变量的值 0xc00001a0a8
*ptr 变量的地址的值20
指针与数组
func main() {
//数组指针
arr1 := [4]int{1, 2, 3, 4}
var p1 *[4]int
p1 = &arr1
fmt.Printf("p1->地址:%p\n", p1)
fmt.Printf("p1地址:%p\n", &p1)
fmt.Printf("p1->地址->值:%d\n", *p1)
(*p1)[0] = 100
fmt.Println(arr1)
fmt.Println(*p1)
//简化写法,指向谁,代表谁
p1[0] = 200
fmt.Println(arr1)
fmt.Println(*p1)
a := 1
b := 1
c := 1
d := 1
arr2 := [4]*int{&a, &b, &c, &d}
fmt.Println(arr2)
fmt.Println(*arr2[1])
}
p1->地址:0xc0000121c0
p1地址:0xc00000a028
p1->地址->值:[1 2 3 4]
[100 2 3 4]
[100 2 3 4]
[200 2 3 4]
[200 2 3 4]
[0xc00001a0a8 0xc00001a0e0 0xc00001a0e8 0xc00001a0f0]
1
指针与函数
func main() {
ptr := f1()
fmt.Printf("ptr的类型%T\n", ptr)
fmt.Println("ptr的地址", &ptr)
fmt.Println("ptr->指向地址的值", *ptr)
fmt.Println(ptr[0])
a := 10
f2(&a)
fmt.Println(a)
}
// 数组型函数指针
func f1() *[4]int {
arr := [4]int{1, 2, 3, 4}
return &arr
}
func f2(ptr *int) {
fmt.Println("ptr", ptr)
fmt.Println("*ptr", *ptr)
*ptr = 100
}
ptr的类型*[4]int
ptr的地址 0xc00000a028
ptr->指向地址的值 [1 2 3 4]
1
ptr 0xc00001a0e0
*ptr 10
100
结构定义