指针作为函数参数传递
指针变量的定义:数据在内存中的地址也称为指针,如果一个变量存储了一份顺据的指针,我们就称它为指针变量。
今天看Go的时候,看到了这样一句话:
Go 函数实参到形参的传递永远都是值拷贝,有时函数调用后实参指向的值发生了变化,那是因为形参传递的是指针值的拷贝,实参是一个指针变量,传递给性产的是这个指针的变量的副本,二者指向同一地址。
然后我就觉得自己悟了,我行了。
放一张我的的思考的思维导图
有了这张图, 再上一串代码,我觉得就差不对了
// golang
package main
import "fmt"
func exchange1(a, b *int){
// 使用的是方法一来处理指针变量参数
a, b = b, a
}
func exchange2(a, b *int){
// 使用的是方法二来处理指针参数变量
c := *a
*a, *b = *b, c
}
func main(){
a, b := -1, 1
fmt.Printf("default value: a = %d, b = %d;\n", a, b)
// 调用exchange1()函数,然后打印a和b的结果
exchange1(&a, &b)
fmt.Printf("after exchage1() value: a = %d, b = %d;\n", a, b)
// 调用exchange2()函数,然后打印a和b的结果
exchange2(&a, &b)
fmt.Printf("after exchage2() value: a = %d, b = %d;\n", a, b)
}
可以看看这窜代码的运行结果:
可以看到,exchange1()并没有改变实参 a和b的值,而exchange2()函数就改变了实参a和b的值,这也和我们的预期是一致的。
然后我又用C进行了一次验证,结果是一致的: