2012-03-05 5 views
1

逆参照:リファレンス/ xはL値(の変数を言わせて)、次のアイデンティティが保持されるアイデンティティ

のx == *(& x)の

これは説明するのは非常に簡単です

、 & xはxへのポインタであり、逆参照演算子*は& xに適用されるため、xはもちろんxを返します。

ここで、逆の意味があるのだろうかと思います。私は疑問に思って正確には場合

のp == &(* P)

pは非ダングリングポインタである

。 これは意味があるようです。なぜなら、* pは既にそれにポインタ(=アドレス)pを持っているため、* p自体がL値(アドレスを持つ値)であるからです。だから、&(* p)はpになる可能性がないので、そのようなポインタはユニークであることだけを知る必要があります。

したがって、両方のアイデンティティが真の場合、数学的に、*と&はお互いの逆関数であると言うことができます。

正しいですか?この主張されているルールには例外がありますか?

+1

'p 'がポインタでない場合、'&(* p) 'は実行できません。 – karlphillip

+0

...しかし、質問はすでに "pがぶら下がりのポインタである"と述べています。 –

+0

おそらく、 "adjoint functors"は "逆"よりも良い言葉でしょう。なぜなら2つは異なる種類のもので動作するからです。 –

答えて

3

pがオブジェクトポインタの場合、&*ppに相当します。 *pの評価は発生せず、これはC標準によって保証されています。オペランドが単項*演算子、そのオペレータどちらも&演算子の結果である場合は、」

(C99、6.5.3.2p3):ここで

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

は、標準の関連段落ですオペレータの制約が適用され、結果が左辺値ではないことを除いて、結果が両方とも省略されたかのように評価されます。

EDIT:@コメントldav1sした後、私は言葉ポインタへのオブジェクトポインタを変更しました。実際にpのタイプがvoid *の場合、&*pは無効です。これについては、Defect Report#102のC委員会で議論されています。http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_012.html

+0

+1。しかし、 'p'は' void * 'にすることはできません。なぜなら、' void * 'を逆参照することは許されていないからです。 – ldav1s

+0

@ ldav1sが合意しました。 'p'は' void * 'にはなりません。私は* pointer *の代わりに* object pointer *の答えを編集しました。 – ouah

+0

非常に良い答え。興味深いことに、&* p自体はL値ではないので、q = &(&*p);でもq =&p;問題ありません。この理論の背後にある論理的根拠は、少なくとも理論的な* pはpの背後にある値のコピーかもしれないので、このコピーのアドレスはp自体と異なっていてもよいでしょうか?それとも、私は思っていますか? – Anthales