【发布时间】:2021-01-29 12:19:57
【问题描述】:
将指针传递给函数我经常感到困惑。如果我们创建一个整数值变量,例如 var a int(在 Go 中为 0)来获取其地址(指向它的指针),我们将使用 & 符号,pA := &a。要获取指针后面的值,我们使用 星号表示法:b := *pA。有道理,没问题。但是为什么该语言的创建者(不仅是 Go)选择指针类型的符号为 *int 而不是 &int(即 func test(i *int) {} 接受整数的地址作为参数)。 * 用于获取值,& 用于获取地址。 *int 读起来就像 int 的值,&int(在语言中并不真正存在)读起来像 int 的地址 .
这是一个关于指针类型符号背后的历史的问题,为什么它是星号而不是&符号,它背后的逻辑是什么?
【问题讨论】:
-
有些人认为
int *x声明x的取消引用类型是int(尽管该论点实际上不适用于void*)。 -
*和&运算符在很大程度上是互逆的。例如,C 中的*&x等价于x(假设&x是允许的)。&运算符后退一步,给出对象的地址,而*运算符向前一步,给出对象的内容。它们是完全相反的。 -
是的,我可以看到它们是如何相反的操作,但这确实是我的观点。为什么使用相反的操作选择指针的符号,而同时存在直接符号(* vs &)。