指针基本概念
指针定义:指针是存储变量内存地址的变量
。
通过这句话我们可以了解到,指针也是一个变量,它有自己的地址,它的值为其它的变量的内存地址。
声明方式:var p *int (声明一个指向int类型的指针)
操作符:
&:获取变量的地址,例如 p = &a
*:解引用指针,获取指针指向的值,例如 *p = 10
package mainimport "fmt"// 此处开始编写代码
func main() {var a int = 100var p *intp = &afmt.Printf("a变量的地址是:%x\n", &a)fmt.Printf("p的值是:%x\n", p)fmt.Printf("p的地址是:%x\n", &p)fmt.Println("a的值为:", a)//通过指针访问值fmt.Println("解引用指针p得到a值为:", *p)//通过指针修改值*p = 500fmt.Println("a的值为:", a)fmt.Println("解引用指针p得到a值为:", *p)
}
/*
a变量的地址是:c0000a6058
p的值是:c0000a6058
p的地址是:c0000ca018
a的值为: 100
解引用指针p得到a值为: 100
a的值为: 500
解引用指针p得到a值为: 500
*/
空指针nil
空指针:未初始化的指针值为nil,解引用会触发panic。
当一个指针被定义之后,没有分配任何变量,那么它的值就是nil
nil在概念上和其它语言null、None都是一样的,指零值或空值。
package mainimport "fmt"// 此处开始编写代码
func main() {var ptr *intif ptr == nil {fmt.Println("ptr为空指针")//fmt.Println("ptr:", *ptr) panic: runtime error: invalid memory address or nil pointer dereference//避免空指针解引用:使用前检查是否为nil。}
}
Go语言指针的限制
go语言的指针不能参与运算
不同类型的指针不允许相互转换
不同类型的指针不能比较和相互赋值
但是go语言提供了绕过这些限制的方法:unsafe
包