1

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

x == *(&x)

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

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

p == &(*p)

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

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

我对么?这个所谓的规则是否有任何可能的例外?

4

1 回答 1

3

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

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

以下是标准的相关段落:

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

编辑:@ldav1s 评论后,我将单词指针更改为对象指针。事实上 ifp是 type void *, then&*p是无效的。有关信息,C 委员会已在缺陷报告 #102 中对此进行了讨论:http ://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_012.html

于 2012-03-05T20:22:08.900 回答