golang变量内存、变量地址、指针变量使用
package main
import "fmt"
func main() {
// 每个变量有2层含义
// 1、 变量的内存:变量的值,如 a = 10,10 就是变量的值,也就是变量对应的内存
// 2、 变量的地址:变量值10所在的内存地址
var a int = 10
// a就是变量a的值(内存)
fmt.Printf("a = %d\n", a) // a = 10
// &a 表示的是变量a的地址
fmt.Printf("&a = %v\n", &a) // &a = 0xc000012088
// 那么我们如何存储a变量的地址呢?答案就是用指针类型
// 指针类型表达式:*类型,如*int,
var p *int // 表示int类型的指针变量,此时它存储的是int类型变量所指向的地址
p = &a
// 我们可以看到p的值 与&a是一样的,都是指向a的地址值
fmt.Printf("p = %v, &a = %v\n", p, &a) // p = 0xc000012088, &a = 0xc000012088
// 那么我们如果通过指针拿到指针对应的地址在内存中的值呢,就是通过p拿到a的值10 而不是a的地址呢?答案:指针前面加*
fmt.Printf("*p = %v, a = %v\n", *p, a) // *p = 10, a = 10
// 那么我们如果通过指针去修改a的值呢?
*p = 666
// 因为p -> &a 指向a在内存中的地址值, 相当于是对于a的引用,而且*p对应的就是a的值,所以我们直接通过给*p赋值即可达到给a变量赋值的效果。可以就把指针理解为java里的引用,通过引用修改变量的值,那么引用对应的对象的值也跟着修改了。引用相当与是遥控器,对象就是电视,通过遥控器可以修改电视的频道,音量等等。
fmt.Printf("*p = %v, a = %v", *p, a) // *p = 666, a = 666
}
运行结果: