CとC#を学んでいます。ポインターについて学んでいますが、間接演算子とアドレス演算子を組み合わせる意味がわかりません。2つを組み合わせるとはどういう意味ですか?
次に例を示します。
int *p, *q;
p = *&q;
CとC#を学んでいます。ポインターについて学んでいますが、間接演算子とアドレス演算子を組み合わせる意味がわかりません。2つを組み合わせるとはどういう意味ですか?
次に例を示します。
int *p, *q;
p = *&q;
&
address of (<something>)
オペレーターと考えることができます。q&q
のアドレスも同様です。今ではオペレーター*
と考えることができます。value at (<something>)
したがって、*q は基本的に、q に含まれるアドレスに格納される値です。つまり、*
変数は常にアドレスを含むものとして扱います。*&q は、結合性によって *(&q) になります。つまり
value stored at (address of q)
と同じですvalue stored at q
q はポインタであるため、q のアドレスは別のアドレスを持つことになります。だからそれは同じです
p=q
それは、それが何を意味しなければならないかを意味します。:)
左から右に読むと、右側は単に「のアドレスを値とするポインタをたどることによって取得される値」を意味しますq
。
と同じなのでp = *(&q);
、 と同じp = q;
です。
私も気づきませんでしたが、あなたのプログラムは宣言するのもポインターp
にするのも間違っています。q
それはコンパイルされません。次のようにする必要があります。
int p, q;
p = *&q;
q
また、これは、読み取られる前に値が割り当てられることはなく、それについて 100% 確実ではないため、少し不明確である可能性があります。
この例では、ポインター p をポインター q の値に設定します。p と q が指す値には何もしません。変数 p を変数 q の値に設定するだけで、どちらもたまたま整数値へのポインターです。いくつかの例を見てみましょう:
*p = *q; // the value at the address pointed by q, gets copied to the address, pointed by p
p = &q; // this is illegal, since the type of &q is int ** (pointer to a pointer to an integer), but the type of p is int *
&q;
変数qのアドレスが得られます。つまり、qへのポインターであり、次のように記述できます
int ** pointerToQ = &q;
私たちが言うなら
*pointerToQ
これは q そのものです。そう
*&q
q に戻るだけです。