6 c pointers nomenclature language-lawyer
通俗地说,取消引用指针意味着将一元运算*符应用于指针.草案文件中只有一个"解除引用"一词的地方(没有"取消引用"的例子),它在脚注中:
102)[...]
在由一元运算
*符解除引用指针的无效值中,有一个空指针,一个与指向的对象类型不适当对齐的地址,以及一个对象在其生命周期结束后的地址
据我所知,一元运算*符实际上被称为"间接运算符",如§6.5.3.2所示:
6.5.3.2地址和间接运营商
4一元运算*符表示间接.[...]
同时,它在附件§J.2中明确称为间接运算符:
- 对象的值由array-subscript
[],member-access.或?>,address&或indirection*运算符或者在创建地址常量(6.6)时强制转换的指针访问.
那么在C中谈论"解除引用指针"是正确的还是过于迂腐呢?术语来自哪里?([]由于§6.5.2.1,我可以通过被称为"引用"的传递)
如果看一下C编程语言,在第一版(1978)中,使用术语"间接".
例子
2.12优先顺序和评估顺序
[...]
第5章讨论*(间接)和&(地址).
,
7.2一元运营商
[...]
一元*运算符表示间接:表达式必须是指针,结果是引用表达式指向的对象的左值.
它也在INDEX中列为例如
Run Code Online (Sandbox Code Playgroud)* indirection operator 89, 187
5.1节中的较长摘录
5.1指针和地址
由于指针包含对象的地址,因此可以通过指针"间接"访问对象.假设这
x是一个变量,比如一个int,那px是一个指针,以一些尚未指定的方式创建.一元运算符c给出一个对象的地址,所以声明Run Code Online (Sandbox Code Playgroud)px = &x;指定
x变量的地址px; px现在被称为"指向"x.&运算符只能应用于变量和数组元素; 构造喜欢&(x+1 )和&3非法.获取寄存器变量的地址也是非法的.一元运算符
*将其操作数视为最终目标之外的地址,并访问该地址以获取内容.因此如果y是alosint,Run Code Online (Sandbox Code Playgroud)y = *px;分配到
y任何px点的内容.所以顺序Run Code Online (Sandbox Code Playgroud)px = &x; y = *px;为y指定相同的值
Run Code Online (Sandbox Code Playgroud)y = x;
在第二版中,解除引用一词出现.
5.1指针和地址
一元运算符*是间接或解除引用运算符 ; 当应用于指针时,它访问指针指向的对象.假设x和y是整数,ip是指向int的指针.这个人工序列显示了如何声明指针以及如何使用&和*:
[...]
然而,该术语("很多")较旧,如在例如中可见
关于抽象数据类型的一些问题的调查,1974年.例如pp24/25.这里与ALGOL 68,PASCAL,SIMULA 67有关.
通过语言将指针转换为值的机制称为"解除引用",一种强制形式(稍后讨论).考虑一下这句话
Run Code Online (Sandbox Code Playgroud)p := q;根据p和q的类型,有几种可能的解释.
设'@'为解引用运算符(即如果p指向j,则@p与j相同),'#'为引用操作(即如果p指向j,则p与#j相同) .下表显示了语言执行分配可能采取的操作:
Run Code Online (Sandbox Code Playgroud)| | 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之类的邮件列表通常也很有用.墨尔本大学Peter Lamb的 一个例子(11/28/83):
解除引用NULL指针是编写"可移植"代码的白痴的另一个例子,但是假设他们的机器是唯一可以运行的机器:使用二进制头设计cpio的同类人.即使在VAX上,取消引用NULL也会让你变得垃圾:确定,*(char*)NULL和*(short*)NULL返回0,但是*(int*)NULL会给你1024528128 !!!!.
[...]
没有提到"解除引用"但仍然; 一个有趣的读物是Ritchie:C语言的发展✝
这里一直使用术语"间接" - 但/和/等.语言之间的联系有点详细.因此,鉴于例如上面提到的1974年的论文,该术语的使用是有趣的.
作为概念和语法的间接例子,例如pp 12 ev.
语法意外导致了语言的复杂性.在C语言中拼写为*的间接运算符在语法上是一元前缀运算符,就像在BCPL和B中一样.这在简单表达式中很有效,但在更复杂的情况下,需要使用括号来指导解析.
[...]
发生了两种效应.最重要的是,C有一套相对丰富的描述类型的方法(比如用Pascal比较).例如,像C-Algol 68那样表达语言的声明 - 描述同样难以理解的对象,仅仅因为对象本身是复杂的.第二个效果归功于语法的细节.C中的声明必须以"由内而外"的方式阅读,许多人都难以理解[Anderson 80].
在这个结合中,也可能值得一提的是ANSI C89,并提到:
3.1.2.5类型
尽管可以将这样的指针转换为可以被解除引用的正常指针类型,但是可以不取消引用指向void的指针.
用于通过一元*运算符解除引用指针的无效值是空指针,对于指向的对象类型不适当地对齐的地址,或者在执行对象的块时具有自动存储持续时间的对象的地址声明并且所有封闭的块已经终止.
(我现在必须重新阅读其中的一些文件.)
Kernighan 和 Ritchie,《C 编程语言》,第二版,5.1:
一元运算符 * 是间接或解引用运算符;[...]“指向 void 的指针”用于保存任何类型的指针,但不能取消引用本身。