*和&的区别 :
- & 是取地址符号 , 即取得某个变量的地址 , 如 :&a
- *是指针运算符 , 可以表示一个变量是指针类型 , 也可以表示一个指针变量所指向的存储单元 , 也就是这个地址所存储的值
通过代码验证:
先构建一个Person类型:
1 | type Person struct { |
- &是取地址符号, 取到Person类型对象的地址
1 | func main(){ |
2.*可以表示一个变量是指针类型(p是一个指针变量):
1 | func main(){ |
3.*也可以表示指针类型变量所指向的存储单元 ,也就是这个地址所指向的值
1 | func main(){ |
4.查看这个指针变量的地址 , 基本数据类型直接打印地址
1 | func main(){ |
总结:
对于p,*p , &p 三个符号三个符号:
- p是一个指针变量的名字,表示此指针所指向的变量的内存地址,如果使用fmt.Printf(“%p”,p)输出的话,它输出的将是p所指向的变量的16进制的内存地址
- *p表示此指针指向的内存地址中存放的内容,一般是一个和指针类型一致的变量或者常量
- &是取地址运算符,&p就是取指针变量p的地址,指针p同时也是个变量,既然是变量,编译器肯定要为其分配内存地址,&p就表示编译器为指针变量p分配的内存地址
也就是说指针变量p指向了一个地址,*p取出了p指向的地址里面存放的值,&p为指针变量p自身的地址