当x是L值(假设为变量)时,则以下标识成立:
x == *(& x)
这很容易解释,因为& x是指向x的指针,而应用于& x的取消引用运算符*当然会返回x。
现在我想知道反过来是否有道理。确切地说,我想知道是否
p ==&(* p)
当p是非悬空指针时。 这似乎是有道理的,因为* p本身就是一个L值(一个有地址的值),因为我们已经有了指针(=地址)p。所以你只需要知道,这样的指针是唯一的,因为那时&(* p)没有其他机会成为p。
因此,当两个身份都是真的时,你可以说,在数学上,*和&是彼此的反函数。
我说错了吗?这个所谓的规则是否有任何可能的例外情况?
答案 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