如何理解 go 语言数组指针作为参数传递?

package main

import "fmt"

func main()  {
    a := [...]int{0,0,0}
    update1(a)
    fmt.Println(a)
    update2(&a)
    fmt.Println(a)
    update3(&a)
    fmt.Println(a)
    update4(&a)
    fmt.Println(a)
}

func update1(a [3]int) {
    a[1] = 1
}
func update2(p *[3]int) {
    a := *p
    a[1] = 2
}
func update3(p *[3]int) {
    (*p)[1] = 3
}
func update4(p *[3]int) {
    p[1] = 4
}

输出:

[0 0 0]
[0 0 0]
[0 3 0]
[0 4 0]
  • update1 可以理解,相当于复制了一个数组,改变复制的数组不会对原有数组有影响
  • update2 如何理解,预期应该和 update3 一样才对?
  • update3 也能理解,传递数组的指针相当于指向同一块内存区域,改变它的值会影响原来的数组
  • update4 是相当于 update3 的语法糖?

主要是不知道如何理解 update2 的结果?

阅读 2.2k
1 个回答

这时因为 update2 中的 a := *p 也默默地进行了数组的复制。
另外,update4 可以视作 update3 的语法糖。

package main

import "fmt"

func main() {
    a := [...]int{1, 2, 3}
    c := &a
    b := *c
    b[1] = 3

    fmt.Println(a)
    fmt.Println(b)
    fmt.Printf("%p\n", &a)
    fmt.Printf("%p\n", &b)

    // output
    // [1 2 3]
    // [1 3 3]
    // 0xc00010a078
    // 0xc00010a090
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题