闲聊级探讨:为什么对指针的定义使用*符号而不是&
前言:本问题是一个闲的蛋疼的关于编程语法设计的讨论,建立在已经弄明白*和&俩符号用法的前提上。
关于指针的*和&的用法,c家族的好几门语言都通用这样的语法(这里用go举例):
var a int = 3
var b *int = &a
println(a)
println(&a)
println(b)
println(*b)
我们都知道,*int代表int的指针,但是综合*b的用法来看,是不是设计成用&int来代表指针更清晰明确一些?
定义时*int的含义:一个指向int数据的指针 使用*b时的含义:沿着指针b的地址取出它所指向的int值 是不是感觉完全不挨着?我们学习这部分内容是应该也都是必须在脑内刻意强调该符号用于定义时和用于操作时的截然不同的含义的吧?
如果用&代替*呢? 此时第二句变成了var b &int = &a 概念上,一是定义了b,类型是int的地址(&|address),二是取出数据a(int)的地址,赋值给b 这个&int不是更为一目了然的代表对一个指针的定义吗?
同时,从*和&互为逆运算的角度考虑也是一样的: 依然基于上面的例子,用 “var b *int” 定义指针时,对*b怎么理解?对一个 *int类型的对象 进行了*操作吧,伪代码类似于*(*int类型的对象),然而操作结果却是一个 int类型的对象(也即例子中的a本身),怎么看都特别反直觉吧,明明叠俩*了,最后这俩却消失了,是不是很容易增加疑惑? 但是如果用&表示指针的定义呢?
var b &int
*b的操作就是类似于*(&int类型的对象),&和*互为逆运算,抵消了,这条语法的返回值是一个int值,是不是就很清晰简明了?
所以最后纳闷的点就是,当初c语言的大老们为啥要这么设计,用*而不是&,是有啥我辈尚未理解的深层含义或者高瞻远瞩吗?
有疑问加站长微信联系(非本文作者)

我也想过这个问题,目前用*&的方式,很容易把人绕进去,我学习go语言的时候也被绕了。如果改成b &int = &a的话,会很简单明了。可能go使用*&的设计是梗为了明确的知道定义指针和获取指针的区别吧。
go是直接沿用c的设定了,避免跨语言沟通或学习时产生冲突……所以问题是当初C干嘛要这么设计了
一样一样,谁让go的创始人有C的背景呢。