【Go】go语言指针
指针基本概念
指针定义:指针是存储变量内存地址的变量
。
通过这句话我们可以了解到,指针也是一个变量,它有自己的地址,它的值为其它的变量的内存地址。
声明方式:var p *int (声明一个指向int类型的指针)
操作符:
&:获取变量的地址,例如 p = &a
*:解引用指针,获取指针指向的值,例如 *p = 10
package main
import "fmt"
// 此处开始编写代码
func main() {
var a int = 100
var p *int
p = &a
fmt.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 = 500
fmt.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 main
import "fmt"
// 此处开始编写代码
func main() {
var ptr *int
if ptr == nil {
fmt.Println("ptr为空指针")
//fmt.Println("ptr:", *ptr) panic: runtime error: invalid memory address or nil pointer dereference
//避免空指针解引用:使用前检查是否为nil。
}
}
Go语言指针的限制
go语言的指针不能参与运算
不同类型的指针不允许相互转换
不同类型的指针不能比较和相互赋值
但是go语言提供了绕过这些限制的方法:unsafe
包