pointers - 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 时?
解决方案
问题一:函数中的指针参数是获取指针的副本还是直接获取指针?
这个问题试图做出的区分表明缺乏背景理解。
将指针视为可用于访问其他数据的数字/地址。此地址的副本只是复制一个数字。42 与“42 的副本”相同吗?是的,在某种意义上。
x := &value // x holds the address of value now
y := x // and now y does, too
鉴于上述两行,分配x
给其他东西绝对不会改变value
or &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 被复制并且x
indouble
变为 42。现在它的x
内部double
和&a
外部都有a
in 其中的地址。
问题 3:如果 x 与 &a 具有相同的值,那么为什么当 x = nil &a stil 具有值而不是 nil 时?
因为x
里面只有值 42,恰好是a
. 如果您将其他任何内容分配给x
,那不会更改a 的地址,是吗?它改变了x
。x
将不再指向a
。
推荐阅读
- javascript - 上传视频,并将第一帧保存为图片 JS
- jquery - 如何在每列中使用jquery计算特定字符的实时onkeyup?
- entity-framework-core - 数据库中已经有一个名为“AspNetRoles”的对象。尝试添加迁移
- c - cs50 pset2 caesar,出现分段错误或不兼容的转换
- html - 打开 Graph 共享调试器抓取空的 html
- javascript - Javascript 的 Shift right with zero-fill operator (>>>) 产生意想不到的结果
- c - c中的原子拷贝
- download - 如何下载 PyPy?
- javascript - 如何获取按钮的值并将其作为 Flask 中另一个页面的标题?
- node.js - 如何通过使用 Windows 命令或 Node.js/Electron 搜索 USB 名称来获取驱动器号?