闲聊级探讨:为什么对指针的定义使用\*符号而不是&

闲聊级探讨:为什么对指针的定义使用*符号而不是&

前言:本问题是一个闲的蛋疼的关于编程语法设计的讨论,建立在已经弄明白*和&俩符号用法的前提上。

关于指针的*和&的用法,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语言的大老们为啥要这么设计,用*而不是&,是有啥我辈尚未理解的深层含义或者高瞻远瞩吗?

显然你又把自己弄糊涂了
在这里,& 是变量的地址是指针*的目的地