首页 > 解决方案 > func 参数中的指针:按值复制或按指针复制

问题描述

这是代码:

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)

}

或在操场上。

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

问题 2:为什么double函数中的x值与main func中的&a相同?

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

标签: pointersgo

解决方案


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

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

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

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

鉴于上述两行,分配x给其他东西绝对不会改变valueor &value。它只是重新分配x给另一个地址。但是,做类似*x = 999改变value本身的事情,因为x持有的地址value和重定向*x意味着访问value.

如果这不是 100% 清楚,请尝试从此处开始完成 Tour of Go

问题 2:为什么 double 函数中的 x 值与 main func 中的 &a 相同?

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

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

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


推荐阅读