K&R v1
如果看一下C 编程语言,在第一版(1978 年)中,使用了术语“间接”。
例子
2.12 评估的优先级和顺序
[…]
第 5 章讨论 *(间接)和 &(地址)。
,
7.2 一元运算符
[…]
一元 * 运算符表示间接:表达式必须是指针,而
result 是一个左值,引用表达式指向的对象。
它也列在 INDEX 中,例如
* indirection operator 89, 187
第 5.1 节的更长摘录
5.1 指针和地址
由于指针包含对象的地址,因此可以通过指针“间接”访问该对象。
假设 x 是一个变量,比如int,而px 是一个
指针,以某种尚未指定的方式创建。一元运算符 c
给出一个对象的地址,所以语句
px = &x;
将 x 的地址分配给变量 px; px 现在说
“指向”x。 & 运算符只能应用于变量
和数组元素; &(x+1 ) 和 &3 这样的结构是非法的。它
获取寄存器变量的地址也是非法的。
一元运算符* 将其操作数视为最终目标之外的地址,并访问该地址以获取内容。因此
如果y 也是int,
y = *px;
将px 指向的任何内容分配给y。所以
序列
px = &x;
y = *px;
为 y 分配相同的值
y = x;
K&R v2
在第二版中,解除引用这个词出现了。
5.1 指针和地址
一元运算符*是间接或解引用运算符;当应用于指针时,它访问指针指向的对象。假设 x 和 y 是整数,而 ip 是指向 int 的指针。这个人工序列展示了如何声明指针以及如何使用 & 和 *:
[…]
以前的用法
然而,这个词比 ("much") 更老,如可以在例如
中看到
A survey of some issues concerning abstract data types, 1974。例如 pp24/25。这里在与 ALGOL 68、PASCAL、SIMULA 67 的连接中说明。
一种语言将指针转换为值的机制是
被称为“解除引用”,一种强制形式(稍后讨论)。考虑声明
p := q;
根据 p 和 q 的类型,有几种可能的解释。
让 '@' 成为解引用运算符(即,如果 p 指向 j ,则 @p 与 j 相同)和
'#' 是一个引用操作(即如果 p 指向 j ,则 p 与 #j 相同)。这
下表显示了一种语言为执行
作业:
|
| type of p
|
| t ref t ref ref t . . .
|
---------------------------------------------------------
|
t | p←q p←#q p←##q
| @p←q @p←#q
| @@p←q
type |
of |
q ref t | p←@q p←q p←#q
| @p←@q @p←q
| @@p←@q
|
|
ref ref t | p←@@q p←@q p←q
. | @p←@@q @p←@q
. | @@p←@@q
. |
|
|
[…]
硬币
还有其他几个使用示例。我无法找到它的确切位置和时间(至少现在还没有)。 (至少 1974 年的论文很有趣。)
为了获得乐趣,查看邮件列表(例如 net.unix-wizards)通常也很有用。 example from Peter Lamb at Melbourne Uni(11/28/83):
取消引用 NULL 指针是白痴的另一个例子
编写“便携式”代码,但假设 THEIR 机器是
只有一个会运行它的人:那些设计过的人
带有二进制标头的 cpio。
即使在 VAX 上,取消引用 NULL 也会给你带来垃圾:当然,*(char *)NULL
和 *(short *)NULL 返回 0,但 *(int *)NULL 会给你
1024528128 !!!!.
[…]
Ed1。加法
没有提到“解除引用”,但仍然;有趣的是 Ritchie:The Development of the C Language ✝
这里也一直使用术语“间接”——但是/和/等等。语言之间的联系有些详细。因此,考虑到例如,该术语的使用很有趣。像上面提到的 1974 年的论文。
作为概念和语法的间接示例,例如第 12 页。
语法上的意外导致了语言的复杂性。间接运算符,在 C 中拼写为 *,在语法上是一元前缀运算符,就像在 BCPL 和 B 中一样。这在简单表达式中效果很好,但在更复杂的情况下,需要括号来指导解析。
[…]
有两种影响发生。最重要的是,C 有一组相对丰富的描述类型的方法(例如,与 Pascal 相比)。像 C-Algol 68 这样富有表现力的语言中的声明,例如,描述了同样难以理解的对象,仅仅是因为对象本身很复杂。第二个影响归因于语法的细节。 C 中的声明必须以许多人难以理解的“由内而外”的风格阅读 [Anderson 80]。
在这个结合中,可能还值得一提 ANSI C89 并提及如下:
3.1.2.5 类型
指向 void 的指针不能被取消引用,尽管这样的指针可以转换为可以被取消引用的普通指针类型。
一元 * 运算符取消引用指针的无效值包括
一个空指针,一个地址与
指向的对象,或具有自动
执行对象所在的块时的存储持续时间
声明并且所有封闭的块都已终止。
(我现在必须重新阅读其中的一些文件。)