Go语言中&和*的区别

*和&的区别 :

  • & 是取地址符号 , 即取得某个变量的地址 , 如 :&a
  • *是指针运算符 , 可以表示一个变量是指针类型 , 也可以表示一个指针变量所指向的存储单元 , 也就是这个地址所存储的值

通过代码验证:

先构建一个Person类型:

1
2
3
4
type Person struct {
Name string
Age int
}
  1. &是取地址符号, 取到Person类型对象的地址
1
2
3
func main(){
fmt.Println(&Person{"xiaoming",8}) // &{xiaoming 8}
}

​ 2.*可以表示一个变量是指针类型(p是一个指针变量):

1
2
3
4
5
6
func main(){
// p 为指针类型变量
var p *Person = &Person{"xiaoming",8}
fmt.Println(p) //&{xiaoming 8}
fmt.Printf("%p",p) //0xc00004a420
}

​ 3.*也可以表示指针类型变量所指向的存储单元 ,也就是这个地址所指向的值

1
2
3
4
5
func main(){
// p 为指针类型变量
var p *Person = &Person{"xiaoming",8}
fmt.Println(*p) // {xiaoming 8}
}

​ 4.查看这个指针变量的地址 , 基本数据类型直接打印地址

1
2
3
4
5
6
func main(){
// p 为指针类型变量
var p *Person = &Person{"xiaoming",8}
//打印存储指针变量p的地址
fmt.Println(&p) // 0xc000080018
}

总结:

对于p,*p , &p 三个符号三个符号:

  • p是一个指针变量的名字,表示此指针所指向的变量的内存地址,如果使用fmt.Printf(“%p”,p)输出的话,它输出的将是p所指向的变量的16进制的内存地址
  • *p表示此指针指向的内存地址中存放的内容,一般是一个和指针类型一致的变量或者常量
  • &是取地址运算符,&p就是取指针变量p的地址,指针p同时也是个变量,既然是变量,编译器肯定要为其分配内存地址,&p就表示编译器为指针变量p分配的内存地址

也就是说指针变量p指向了一个地址,*p取出了p指向的地址里面存放的值,&p为指针变量p自身的地址