Bootstrap

golang学习6-指针

指针就是地址。 指针变量就是存储地址的变量。
*p:解引用、间接引用。
栈帧:用来给函数运行提供内存空间。取内存于 stack 上。

当函数调用时,产生栈帧。函数调用结束,释放栈帧。

栈帧存储:1.同部变量。2.形参。(形参与局部变量存储地位等同)3.内存字段描述值 

 

 

变量存储:
等号 左边的变量,代表 变量所指向的内存空间。
等号 右边的变量,代表 变量内存空间存储的数据值。

指针的函数传参。
传地址(引用):将形参的地址值作为函数参数、返回值后传递,
传值(数据据):将实参的 值 拷贝一份给形参。

传引用:在A栈帧内部,修改B栈帧中的变量值。

package main

import "fmt"

func swap(a, b int) {
	a, b = b, a
	fmt.Println("a:", a, "b:", b)
}

func swap2(x, y *int) {
	*x, *y = *y, *x
}

func main() {
	//var a int = 10
	//var p *int = &a
	//
	//a = 100
	//fmt.Println("a=", a)
	//
	//*p = 250 //借助a变量的地址,操作a对应空间
	//fmt.Println("a=", a)
	//fmt.Println("*p", *p)
	//
	//a = 1000
	//fmt.Println("*p", *p)

	//var a int = 100
	//fmt.Println("&a=%p\n", &a)
	//
	//var p *int = nil
	//p = &a
	//fmt.Println("p=%p\n", p)
	//fmt.Println("a=%d,*p=%d\n", a, *p)
	//*p = 324
	//fmt.Println("a=%d,*p=%d\n", a, *p)
	//
	//var p *int
	在heap上申请一片内存地址空间
	//*p = 100
	//p = new(int) //默认类型的 默认值
	//fmt.Println("%q\n", *p)

	a, b := 10, 20
	swap(a, b) //传变量值
	fmt.Println("a:", a, "b:", b)

	swap2(&a, &b) //传地址值
	fmt.Println("a:", a, "b:", b)
	//函数传参:值传递
	//实参将自己的值(地址值)拷贝一份,给形参
}

;