1.值传递
2.指针传递
函数执行步骤如下:
- p *int
定义指针类型的变量 ⇒ &p = 0x0843A048, p(内存)=0x0000000 # 0的地址位置
即:指针实质: p指向了0的内存地址
- var a=1
定义a ⇒ a(内存)=1, &a = 0x0843A040
- &a
a的指针地址 ⇒ &a = 0x0843A040
- p = &a
p(内存)=0x0843A040, &p = 0x0843A048
(p的虚拟内存地址是没变的,变的是储存在内存里的"地址")
即:指针实质: p指向了a的内存地址
- 区分p=10和*p=10
p = 10 ⇒ p(内存)=10, p和a的指针联系断掉
*p= 10 ==> 即找到p对应的虚拟内存地址,然后找到对应的内存值,然后修改 > 找0x0843A040> 找0x0843A040 ==>1 变为10
3.练习题:交互2个值
package main
import "fmt"
/*
// 不会交换a,b
func swap(a, b int) {
var temp int
temp = a
a = b
b = temp
}
*/
func swap(pa, pb *int) {
var temp int
temp = *pa // 将a所对应的内存值暂存
*pa = *pb
*pb = temp
}
func main() {
var a int = 10
var b int = 20
swap(&a, &b)
fmt.Println("a=", a, "b=", b)
}
4.go中的二级指针
func main() {
var a int = 10
fmt.Println("a=", a)
var p *int
p = &a
fmt.Println("&a =", &a) //&a = 0xc000012098
fmt.Println("p =", p) // p = 0xc000012098
fmt.Println("&p =", &p) //&a = &p = 0xc00000e030
var pp **int // 二级指针
pp = &p
fmt.Println("&p =", &p) //&a = &p = 0xc00000e030
fmt.Println("pp =", pp) // pp = 0xc00000e030
}s
感觉兴趣的小伙伴可以加好友一起交流!!