前言:本问题是一个闲的蛋疼的关于编程语法设计的讨论,建立在已经弄明白*和&俩符号用法的前提上。
关于指针的*和&的用法,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值,是不是就很清晰简明了?
显然你又把自己弄糊涂了
在这里,& 是变量的地址是指针*的目的地