我正在参加「掘金·启航计划」
Go语言的指针不能进行偏移和运算,是安全指针。
Go语言中函数传参都是值拷贝,当我们想改变某个变量的时候,我们可以创建一个指向该变量地址的指针变量。传递数据使用指针,而无需拷贝数据。
1、指针地址和指针类型
每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置。Go语言中使用&字符放在变量前面对变量进行取地址操作。Go语言中的值类型都有对应的指针类型,如*int、*int64、*string。
取变量指针的语法如下:
ptr := &v
//其中:
//v代表被取地址的变量,类型为T
//ptr用于接收地址的变量,ptr类型就位*T,称做T的指针类型。*代表指针
示例:
func main(){
a := 10
b := &a
fmt.Printf("a:%d ptr:%p\n", a, &a) //a:10 ptr:0xc00001a088
fmt.Printf("b:%p type:%T\n", b, b) //b:0xc00001a088 type:*int
fmt.Println(&b) //0xc00000e028
fmt.Println(*b) //10
}
2、指针取值
对普通变量使用&操作符取地址后会得到这个变量的指针,然后可以对指针使用*操作,也就是指针取值。
func main(){
a := 10
b := &a
c := *b
fmt.Println(c) // 10
}
总结:取地址符操作&和取值操作符*是一对互补操作符,&取出地址,*根据地址取出地址指向的值。
- 对变量进行取地址(&)操作,可以获取变量的指针变量。
- 指针变量的值是指针地址
- 对指针变量进行取值(*)操作,可以获取指针变量指向的原变量的值。
3、空指针
当一个指针被定义后没有分配到任何变量时,他的值为nil
空指针的判断:
func main(){
var p *string
if p != nil {
//非空
} else {
//空值
}
}
4、变量、指针地址、指针变量、取地址、取值的相互关系和特性如下:
- 对变量进行取地址操作使用
&操作符,可以获得这个变量的指针变量。 - 指针变量的值是指针地址。
- 对指针变量进行取值操作使用
*操作符,可以获得指针变量指向的原变量的值。