当x是一个L值(假设是一个变量)时,那么下面的恒等式成立:
X == *(&x)
这很容易解释,因为&x是指向x的指针,应用于&x的解引用运算符*当然会返回x。
现在我想知道反面是否有意义。准确地说,我想知道
P == &(*p)
当p是非悬空指针时。这似乎是有道理的,因为*p本身就是一个L值(一个有地址的值),因为我们已经有了指向它的指针(=adress) p。所以你只需要知道,这样的指针是唯一的,因为这样&(* p )就没有其他机会成为p了。
因此,当两个恒等式都为真时,你可以说,从数学上讲,*和&是彼此的反函数。
我说的对吗?这个所谓的规则有没有可能有例外?
发布于 2012-03-06 04:22:09
当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中对此进行了讨论
https://stackoverflow.com/questions/9573305
复制相似问题