【问题标题】:Pointer in func parameter: copy by value or by pointerfunc 参数中的指针:按值复制或按指针复制
【发布时间】:2020-04-04 12:05:21
【问题描述】:

代码如下:

package main

import "fmt"

func double(x *int) {
    fmt.Printf("pointer of pointer #1: %p\n", &x)
    fmt.Printf("pointer#1 : %p\n", x)

    *x += *x
    x = nil
    fmt.Printf("pointer#2 : %p\n", x)
    fmt.Printf("pointer of pointer #2: %p\n", &x)

}

func main() {
    var a = 3
    double(&a)
    fmt.Println(a) // 6
    fmt.Printf("pointer a in main: %p\n", &a)

    p := &a
    double(p)
    fmt.Println(a, p == nil) // 12 false
    fmt.Printf("pointer p in main: %p\n", p)
    fmt.Printf("pointer of pointer p in main: %p\n", &p)

}

playground

问题一:函数中的指针参数是获取指针的副本还是直接获取指针?

问题2:为什么double函数中的值xma​​in函数中的&a是一样的?

问题 3:如果 x&a 的值相同,那么为什么当 x = nil &a 仍然有值而不是零?

【问题讨论】:

  • 第一季度。指针的副本。 Q2。因为这就是副本的作用/含义。 Q3。因为1。
  • Go 很简单,每个作业都是一个副本。

标签: pointers go


【解决方案1】:

问题一:函数中的指针参数是获取指针的副本还是直接获取指针?

这个问题试图做出的区分表明缺乏对背景的理解。

将指针视为可用于访问其他数据的数字/地址。此地址的副本只是复制一个数字。 42 与“42 的副本”相同吗?是的,从某种意义上说。

x := &value // x holds the address of value now
y := x      // and now y does, too

鉴于以上两行,将x 分配给其他东西绝对不会改变value&value。它只是将x 重新分配给另一个地址。但是,像*x = 999 这样的操作会改变value 本身,因为x 拥有value 的地址,而重定向*x 意味着访问value

如果这不是 100% 清楚,请尝试通过 Tour of Go starting here 解决。

问题2:为什么double函数中的x值和main函数中的&a是一样的?

因为上面的解释。 &aa 的地址——它是一个数字,再想想 42(实际地址类似于 0x40e020,但为了简单起见,我们称它为 42)。当你将它传递给一个接受*int的函数时,42被复制并且double中的x变成42。现在x里面的double&a外面都有a的地址他们。

问题 3:如果 x 与 &a 具有相同的值,那么为什么当 x = nil &a stil 具有值而不是 nil 时?

因为x里面只有值42,恰好是a的地址。如果您将其他任何内容分配给x,这不会改变a 的地址,是吗?它改变了xx 将不再指向 a

【讨论】:

    猜你喜欢
    • 2017-07-03
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 2013-05-04
    相关资源
    最近更新 更多