参考/解除引用标识

时间:2012-03-05 20:14:06

标签: c pointers reference dereference inverse

当x是L值(假设为变量)时,则以下标识成立:

x == *(& x)

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

现在我想知道反过来是否有道理。确切地说,我想知道是否

p ==&(* p)

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

因此,当两个身份都是真的时,你可以说,在数学上,*和&是彼此的反函数。

我说错了吗?这个所谓的规则是否有任何可能的例外情况?

1 个答案:

答案 0 :(得分:3)

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

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

以下是标准的相关段落:

  

(C99,6.5.3.2p3)“如果操作数是一元*运算符的结果,那么运算符和&运算符都不会被计算,结果就好像两者都被省略了,除了对它的约束运算符仍然适用,结果不是左值。“

编辑:在@ ldav1s评论之后,我将指针改为对象指针。实际上,如果p的类型为void *,则&*p无效。有关信息,C委员会在缺陷报告#102中讨论过这个问题:http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_012.html