为什么C使用星号作为指针?
很简单-因为B做到了。
由于内存是线性数组,因此可以将单元格中的值解释为该数组中的索引,并且BCPL为此提供了一个运算符。它的原始语言是拼写的rv
,后来!
B用一元的拼写*
。因此,如果p
一个单元格包含另一个单元格的索引(或该单元格的地址)或指向另一个单元格的指针,*p
则将其指向所指向的单元格的内容,作为表达式中的值或作为赋值的目标。
从C语言的发展
而已。在这一点上,问题就像“为什么python 3为什么要使用.
一个方法?为什么不->
呢?” 一样有趣。好吧……因为Python 2使用.
了调用方法。
一种语言很少存在于无。它具有影响力,并且是基于以前发生的事情。
那么,为什么B !
不像它的前身BCPL那样使用取消引用的指针呢?
好吧,BCPL有点罗word。代替&&
或||
BCPL使用logand
和logor
。这是因为大多数键盘上没有∧
或∨
不等于键实际上就是这个词NEQV
(请参阅《 BCPL参考手册》)。
B似乎在某种程度上受到了启发,希望加强语法,而不是为程序员经常使用的所有这些逻辑运算符加长字。从而!
为解引用成为*
使!
可用于逻辑否定。请注意,一元运算*
符和二进制*
运算符(乘法)之间存在差异。
好吧,其他选择->
呢?
在->
被送往句法糖围绕场derefrences struct_pointer->field
这是(*struct_pointer).field
其他类似的选项<-
可能会导致模棱两可的解析。例如:
foo <- bar
可以理解为:
(foo) <- (bar)
要么
(foo) < (-bar)
使一个由二元运算符和另一个一元运算符组成的一元运算符很可能会遇到问题,因为第二个一元运算符可能是另一个表达式的前缀。
此外,再次重要的是要尽量减少经常键入的内容。我不愿意写:
int main(int argc, char->-> argv, char->-> envp)
这也变得难以阅读。
可能还有其他字符(@
直到Objective C才使用了)。再说一次,这是“ C使用的核心,*
因为B这样做了”。B为什么不使用@
?好吧,B没有使用所有字符。B中没有bpp
程序(比较cpp),其他字符可用(例如#
cpp以后使用的字符)。
如果我可能会冒险猜一个原因-这是因为键在哪里。从B的手册中:
为了方便在可能的情况下操纵地址,B提供了两个一元地址运算符,*
和&
。&
是地址运算符,假设&x
的地址为1 x
,那么它的地址也是如此。*
是间接运算符;*x
表示“将x的内容用作地址”。
请注意&
是shift-7和*
shift-8。它们彼此之间的接近性可能暗示了程序员所做的事情……但这只是一个猜测。有人会问肯·汤普森为什么要做出这种选择。
所以你有它。C之所以这样,是因为B是。B之所以这样,是因为它想改变BCPL的方式。
->
在C语言中,它被用作解除引用运算符-访问struct:中的字段时struct_pointer->field
,这是的缩写(*struct_pointer).field
。