当 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。事实上,如果 p
是 void *
类型,那么 &*p
是无效的。有关信息,C 委员会已在缺陷报告 #102 中对此进行了讨论:http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_012.html
关于c - 引用/取消引用身份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9573305/