这个问题将从草案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_ 22y = *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的指针"用于容纳任何类型的指针,但不能自行取消引用。