代码如下
package main
import "fmt"
func swap(a, b *int) (*int, *int) {
fmt.Printf("a2: %v %p\n", *a, a)
a, b = b, a
fmt.Printf("a3: %v %p\n", *a, a)
return a, b
}
func main() {
a := 3
b := 4
fmt.Printf("a1: %v %p\n", a, &a)
c, d := swap(&a, &b)
fmt.Printf("a4: %v %p\n", a, &a)
fmt.Println(*c, *d)
}
打印输出:
a1: 3 0xc0000120b8
a2: 3 0xc0000120b8
a3: 4 0xc0000120d0
a4: 3 0xc0000120b8
问题:
1.golang指针类型无法运算,为什么swap函数中 a,b=b,a可以执行?
2.从swap中打印的a2、a3来看,a指向的地址已经发生了变化。操作的是指针类型,跳出swap函数之后a应该还是修改后的值,为什么a4与a3的打印结果不一致?
有疑问加站长微信联系(非本文作者)

楼主可能对指针和参数传递理解不深? 一句话解释这个就是此a,b非彼a,b
&a就是指向a的地址啊,而且第一行和第二行打印的值和地址都是一致的。 指针传参,修改的不就是指针指向的内存吗
你改的a的这个*int变量的值,又没改它对应的对象……
你如果要改指针的值,必须要使用指向指针的指针. 你传入的这个指针,实际上是被复制到堆栈的一个引用而已. 在里面交换了引用a,b, 并没有能改变实际的指针. 亲, 你的C语言看样子没掌握好,有空还是温习温习吧. go语言虽然很简单,但是有些东西也容易绕晕人的.
稍微做个修改,楼主可能会清晰点
newA和a的唯一联系就是newA的值是a的地址,所以对newA进行操作不会改变a,只有对*newA操作才会改变a的值。感觉清晰好多,感谢!
想要修改变量的地址,首先需要的是一个指针变量才可以,并且需要用到多重指针。 正常变量的地址是固定的。