为什么指向 int 的指针用“*int”而不是“&int”初始化?

Dar*_*ius 0 pointers reference go memory-address dereference

例如,当初始化一个指向 int 的指针时,我们使用:

var pointer *int
Run Code Online (Sandbox Code Playgroud)

为什么语法不是:

var pointer &int
Run Code Online (Sandbox Code Playgroud)

对我来说,第二个版本更有意义,因为它读起来像“变量‘指针’是一个整数的内存地址”

或者换句话说,我发现“*”既用于定义内存地址类型(如上所述)又用于取消引用,例如 *pointer = 123

这是否像看起来那样令人困惑,还是我在这里遗漏了什么?

Von*_*onC 5

&地址运算符,而不是类型。

对于x类型为 的操作数T地址操作 &x生成类型*T为 to的指针x

但确实*也用作指针间接

一个操作数x指针类型的*T,所述指针间接*x表示类型的变量T指向x

正如Go 之旅中所见,同时*引用类型和运算符。

2016 年的这个帖子提出了一个类似的问题。

当然,指针语法只是从 C 复制而来。
另请参阅Go 的声明语法
如果我们使用了 ' &',那么 Go 指针看起来就像一个 C++ 引用。

和:

*int定义一个指针类型,然后可以在有或没有*变量的情况下使用。

  • 随着*您访问指向的值。
  • 没有,您访问指向的内存地址。

& 从变量中检索内存地址。

地址不是指针,反之亦然。
您可以使用内存地址定义指针。

var x int = 10    // declare an int variable `x` holding the value 10.
var y *int = &x  // Create a pointer `y` *using* the memory address of `x`.
Run Code Online (Sandbox Code Playgroud)

*y将有值 10。
y将是内存地址x


Dave Cheney 的Pointers in Go ”中查看更多信息:

Go 指针,就像 C 指针一样,是指向其他值的值。这是一个非常重要的概念,不应被视为危险或需要挂断的东西。

指针是指向另一个变量的内存地址的值

但:

您不能更改地址 p 指向的地址,除非您为其分配另一个地址
No:var p *int; p++可能。

(另见“ Go at Google:软件工程服务中的语言设计”)

一旦一个值被赋值给一个指针,除了 nil 之外,Go 保证被指向的东西在指针的生命周期内将继续有效。