Go学习笔记—指针
感谢观看,如有错误,请留言指点!
1、指针的基础
Go语言像C语言一样保留了指针的用法,但是Go的指针是安全指针,不能进行偏移和运算。
首先我们区分一下指针变量和普通变量
- 指针变量:定义一个空间用来存储值的地址
- 普通变量:定义一个空间直接存储值本身
其次是指针类型和指针取值:
- 指针类型:
*int
,*string
等,对应的每一种数据类型都可以当做指针类型使用。
类似C语言,Go语言也使用&
和*
来操作关于指针的变量
&
:代表取地址符,用来获取一个变量的地址存到另一个变量中*
:代表取值符,用来从存地址的变量中获取值
func mainPointer() {
var a int
a = 100 //此时a是一个普通的变量
fmt.Printf("%d\n", a) //a存储一个值
b = &a //b存放的是a的地址,此时b是一个指针变量
fmt.Printf("%p\n", b) //b存储一个地址
fmt.Printf("%p\n", &a) //&a存储一个地址
fmt.Println(*&a) //*&a存储一个值
//fmt.Printf("%x\n",&a)
//指针变量的定义,用来存储变量的地址
var p *int //定义指针变量
//*int属于指针类型
//定义指针变量就是定义一个空间用来存储地址
p = &a //把变量a的地址赋值给变量p
fmt.Println(p) //此时p存储的是a的地址
*p = 80 //将p对应的地址赋值为80
fmt.Printf("a=%d,p=%v\n", a, p)
fmt.Printf("a=%d,p=%v", a, *p)
}
2、指针的拓展
- 空指针是指不取地址的指针变量。默认值是
nil
//空指针
var q *int
fmt.Println(q)
//指针的空值为nil,系统中默认的值
new()
函数,用于创建指定类型大小的地址空间
var p *int
p = new(int)
*p = 57
fmt.Println(p, *p)
- 指针作为函数参数
package main
import "fmt"
func Swap(num1,num2 *int){
*num1,*num2 = *num2,*num1
fmt.Println(*num1,*num2)
}
func main() {
a := 10
b := 20
Swap(&a,&b)
//普通变量在函数中传递是值传递
//指针变量作为函数参数是地址传递
fmt.Println(a,b)
}