私が持っている場合:
int j = 8;
int *pointer = &j;
もしそうなら:
&*pointer == *&pointer
1
( )を返しますtrue
。
しかし、2 番目の表現には疑問があります。
&*pointer
ポインタが指すアドレスを返します (最初に * が評価され、次に & が評価されます)*&pointer
ポインターアドレスを返し、次にそれが指すものを返します...しかし、これはアドレスではなく変数です。ここで私の疑問は...
pointer
メモリ内のあるアドレスを「ポイント」します。メモリ内の他のアドレスに存在します。
&*pointer // (*pointer) - dereference `pointer`, now you have `j`
// &(*pointer) - the address of `j`(that's the data that `pointer` has)
一方:
*&pointer //(&pointer) - the address of pointer(where pointer resides in memory)
// *(&pointer) - deference that address and you get `pointer`
私は常にポインターを写真で追跡する方が簡単だと思うので、この図はそれらが同じである理由を理解するのに役立つかもしれません:
//In case of &*pointer, we start with the pointer, the dereference it giving us j
//Then taking the address of that brings us back to pointer:
+--&(*pointer)-----------+
| |
memory address 0x7FFF3210 | 0x7FFF0123 |
+------------+ | +-----+ |
data present | pointer = | <---+ +-> | j=8 |----+
| 0x7FFF0123 | ->(*pointer)-+ +-----+
+------------+
//in the *&pointer case, we start with the pointer, take the address of it, then
//dereference that address bring it back to pointer
memory address +------------> 0x7FFF3210 ----*(&pointer)--+
| |
| +------------+ |
data present | | pointer = | <----------- -+
+--&pointer ---| 0x7FFF0123 |
+------------+
pointer
これらの式は、 が基本型への生のポインターである限り、同等です(そのため、operator &
とoperator *
はオーバーロードされません。そうしないと、同等性が保持されない可能性があります)。
実際、この表現:
*(&pointer) // Evaluates to the address of j
最初のアドレスを計算してpointer
から逆参照します。これにより、 のアドレスであるの値が得られます(それが の初期化方法であるため)。一方、この式は次のようになります。pointer
j
pointer
&(*pointer) // Evaluates to the address of j
最初に逆参照pointer
( への参照を与えるj
) を行い、次にそのアドレスを取得します (したがって、 のアドレスに評価されますj
)。
ご覧のとおり、どちらの式も のアドレスに評価されるため、j
同等です。
C では、通常、型を右から左に読む方がはるかにうまくいきます。
int *pointer = &j;
(int *) = the pointer to an integer
(&) = the address of
それで
(&*) = the pointer to an address of
(*&) = the address of a pointer
ポインターのアドレスはポインターに割り当て可能であり (任意のアドレスはポインターに割り当て可能)、任意のポインターもポインターであるため、割り当てが型ごとに機能するようになります (しかし、私はそうではありません)。非常に機能的だと思います)。
他には何も意味がないので、それらは同一です。&*pointer
-が指すオブジェクトのアドレスであり、pointer
それが値 (格納されているアドレス)pointer
そのものです。
*&pointer
(逆参照された変数pointer
のアドレス) のアドレスが指すオブジェクトです - 繰り返しますが、それ自体です。pointer
pointer
*&pointer
ポインターアドレスを返し、次にそれが指すものを返します...しかし、これはアドレスではなく変数です。ここで私の疑問は...
これを 1 つずつ実行してみましょう。
&pointer
型int**
であり、変数を指しpointer
ます。
*&pointer
は上記を逆参照し、実質的に単に と同等ですpointer
。