登录
首页 >  Golang >  Go问答

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

来源:SegmentFault

时间:2023-01-08 13:16:04 199浏览 收藏

来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习Golang相关编程知识。下面本篇文章就来带大家聊聊《如何理解 go 语言数组指针作为参数传递?》,介绍一下数组、指针、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 的结果?

正确答案

这时因为 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
}

本篇关于《如何理解 go 语言数组指针作为参数传递?》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表