c - 引用/取消引用身份

标签 c pointers reference dereference inverse

当 x 是一个 L 值(假设是一个变量)时,以下恒等式成立:

x == *(&x)

这很容易解释,因为 &x 是指向 x 的指针,应用于 &x 的取消引用运算符 * 自然会返回 x。

现在我想知道反过来是否有意义。准确地说,我想知道是否

p == &(*p)

当 p 是一个非悬挂指针时。 这似乎是有道理的,因为 *p 本身就是一个 L 值(一个有地址的值),因为我们已经有了指向它的指针(=地址)p。所以你只需要知道,这样的指针是唯一的,因为 &(*p) 没有其他机会成为 p。

因此,当两个恒等式都为真时,您可以说,在数学上,* 和 & 是彼此的反函数。

我说的对吗?这种所谓的规则是否有任何可能的异常(exception)情况?

最佳答案

p是对象指针时,&*p等价于p*p 的评估不会发生,这是由 C 标准保证的。

char *q, *p = NULL;
q = &*p;  // equivalent to q = p;

这是标准的相关段落:

(C99, 6.5.3.2p3) "If the operand is the result of a unary * operator, neither that operator nor the & operator is evaluated and the result is as if both were omitted, except that the constraints on the operators still apply and the result is not an lvalue."

编辑:在@ldav1s 发表评论后,我将单词pointer 更改为object pointer。事实上,如果 pvoid * 类型,那么 &*p 是无效的。有关信息,C 委员会已在缺陷报告 #102 中对此进行了讨论:http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_012.html

关于c - 引用/取消引用身份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9573305/

相关文章:

c - C 中的动态编程资源?

C argv 数据的最大大小是多少

c - 将 char** 作为参数传递给 C 中的函数

c - 新手 C 程序员对错误感到好奇

pointers - 在 Go 的循环中处理指针结构的正确方法是什么?

c - fork() 函数在这个程序中是如何工作的?

c - 将NULL分配给C中链表中的头节点

Python 混淆函数引用

reference - 借用的值在循环中的生命周期不够长

jquery - jQuery 的扩展是否在对象之间创建引用?