【问题标题】:Why the notation of pointer type starts with asterisk? [closed]为什么指针类型的符号以星号开头? [关闭]
【发布时间】: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 &)。

标签: c go pointers


【解决方案1】:

来自 DMR 的The Development Of the C Language

对于这种组合类型的每个对象,已经有一种方法可以提及底层对象:索引数组,调用函数,在指针上使用间接运算符。类比推理导致名称的声明语法反映了名称通常出现的表达式语法。因此,

int i, *pi, **ppi;

声明一个整数,一个指向整数的指针,一个指向指向整数的指针。这些声明的语法反映了i*pi**ppi 在表达式中使用时都会产生 int 类型的观察结果。

因此,他们将星号用于指针变量声明,因为这是用于解除对所述指针的引用(并且来自早期的 B 语言)。

【讨论】:

    猜你喜欢
    • 2016-05-07
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多