c语言 - "dereferencing"这个词从何而来?



这个问题将从草案N1570中获得信息,所以基本上是C11。

通俗地说,取消引用指针意味着将一元*运算符应用于指针。文件草案中只有一个地方存在"取消引用"一词(没有"取消引用"的例子),它在脚注中:

102)[…]

在用于由一元*解引用指针的无效值中运算符是一个空指针,一个不适当对齐的地址指向的对象的类型,以及寿命结束

据我所见,一元*运算符实际上被称为"间接运算符",如§6.5.3.2:所证明

6.5.3.2地址和间接寻址运算符

4一元*运算符表示间接性。[…]

类似地,它在附录§J.2:中被明确地称为间接运算符

-对象的值由数组下标CCD_ 6访问,成员访问.−>、地址&或间接*运算符或创建地址常量时的指针投射(6.6)。

那么,在C中谈论"取消引用指针"是正确的,还是过于迂腐?术语来自哪里?(我可以对[]由于§6.5.2.1而被称为"延期"表示赞同)

K&R v1

如果看一下C编程语言,在1978年第一版中,使用了术语"间接">

示例

2.12评估的优先级和顺序

[…]

第5章讨论了*(间接)和&(的地址)。

7.2一元运算符

[…]

一元*运算符表示间接:表达式必须是指针结果是一个左值,它指向表达式所指向的对象。

它也被列在INDEX中,例如

* indirection operator 89, 187

第5.1节的更长摘录

5.1指针和地址

由于指针包含对象的地址,因此可以通过指针"间接"访问对象。假设x是一个变量,比如int,而px是一个指针,以某种尚未指定的方式创建。一元运算符c给出对象的地址,因此语句

px = &x;

x的地址分配给变量px; px现在被称为"指向">x。&运算符只能应用于变量以及阵列元件;像CCD_ 18和CCD_。它获取寄存器变量的地址也是非法的。

一元运算符*将其操作数视为离开最终目标的地址,并访问该地址以获取内容。因此如果CCD_ 21等于CCD_ 22

y = *px;

px所指向的内容分配给y序列

px = &x;
y = *px;

将与相同的值分配给y

y = x;

K&R v2

在第二版中,术语取消引用出现。

5.1指针和地址

一元运算符*是间接运算符或取消引用运算符;当应用于指针时,它访问指针指向的对象。假设x和y是整数,ip是指向int的指针。这个人工序列显示了如何声明指针以及如何使用&和*:

[…]


先前使用

然而,该术语("很多">)较旧,如

关于抽象数据类型的一些问题的调查,1974年。E.g第24/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向导)通常也很有用。墨尔本大学的Peter Lamb的一个例子(11/28/83)

取消引用NULL指针是白痴的又一个例子编写"可移植"代码,但是,假设THERM机器是只有一个人会在上面运行:设计带有二进制标头的cpio。即使在VAX上,取消引用NULL也会导致垃圾:当然,*(char*)NULL和*(short*)NULL返回0,但*(int*)NULL将返回01024528128!!!!。

[…]


Ed1.添加

没有提及"取消引用">,但仍然;一本有趣的读物是Ritchie:C语言的发展✝

在这里,术语"间接">也一直被使用——但是/和/等等。语言之间的联系有些详细。因此,考虑到例如上述1974年的论文,该术语的使用是有趣的。

作为间接作为概念和语法的例子,例如pp 12 ev.

语法的意外导致了语言的复杂性。间接运算符,在C中拼写为*,在语法上是一个一元前缀运算符,就像在BCPL和B中一样。这在简单表达式中很有效,但在更复杂的情况下,需要括号来指导解析。

[…]

有两种影响正在发生。最重要的是,C有一套相对丰富的描述类型的方法(例如与Pascal相比)。在像C这样具有表达能力的语言中,比如Algol 68,声明描述的对象同样难以理解,因为对象本身很复杂。第二个效果是由于语法的细节。C语言中的声明必须以"由内而外"的风格阅读,许多人觉得很难理解[Anderson80]。


在这个词中,它可能也值得一提ANSI C89,并提到:

3.1.2.5类型

指向void的指针不能被取消引用,尽管这样的指针可以被转换为可以被取消引用的普通指针类型。

  • ANSI C标准草案(ANSI X3J11/88-090),(由维基百科提供)
  • 美国信息系统国家标准——程序设计语言——C的基本原理

一元*运算符取消引用指针的无效值包括一个空指针,一个与指向的对象,或具有自动执行对象所在的块时的存储持续时间已声明,并且所有封闭块的已终止。

(我现在必须重读其中一些文档。)

因为在K&RC,该语言只按值传递参数。因此,指针被用来通过引用来模拟传递参数。人们(错误地)提到引用变量来构造指向变量的指针。

而指针的去引用则是相反的操作。

现在C++使用不同于指针的真正引用,但仍使用解引用一词(即使它不是真正正确的)。

我不知道确切的词源,但可以将指针值(在一般意义上,而不是C/C++特定的含义)视为"引用"内存中的另一个对象;即p是指x。当我们使用p来获得存储在x中的值时,我们绕过了该引用,或者取消引用p

Kernighan和Ritchie,C编程语言,第2版,5.1:

一元运算符*是间接运算符或取消引用运算符;[…]"指向void的指针"用于容纳任何类型的指针,但不能自行取消引用。

相关内容

  • 没有找到相关文章

最新更新