每个变量都在内存中有地址,指针的值就是地址!
指针(%p
)
ptr := &x
x := *ptr
指针的类型
上图 x
为 int
类型,则对应的指针 ptr
为 *int
类型。(诸如此类)
理解指针的用途
对指针的操作就是对原数据的操作
注:函数的压栈都是将形参的值拷贝进自己的函数空间!!!
func swap1(a, b int) { /拷贝进来的是变量值
a,b = b,a
}
func swap2(a, b *int) { /拷贝进来的是变量地址
*a,*b = *b,*a
}
func main(){
x := 11
y := 22
swap1(x,y) /没有影响原变量
fmt.Printf("x=%d y=%d",x,y) //x=11 y=22
swap2(&x,&y) /影响了原变量
fmt.Printf("x=%d y=%d",x,y) //x=22 y=11
}
函数返回派生(自定义)数据类型的指针
func NewUser(name string) *User { //*User是指针类型啊
return &User{name: name}
}
new()凭空创建指针
str := new(string)
此时 str
就是一个*string
类型的指针,并且会分配内存,并有默认值!
*str = "给指针指向的变量赋值"