4

私が持っている場合:

int j = 8;
int *pointer = &j;

もしそうなら:

&*pointer == *&pointer 

1( )を返しますtrue

しかし、2 番目の表現には疑問があります。

  1. &*pointerポインタが指すアドレスを返します (最初に * が評価され、次に & が評価されます)
  2. *&pointerポインターアドレスを返し、次にそれが指すものを返します...しかし、これはアドレスではなく変数です。ここで私の疑問は...
4

7 に答える 7

5

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 |         
                                        +------------+
于 2013-04-08T15:17:03.547 に答える
4

pointerこれらの式は、 が基本型への生のポインターである限り、同等です(そのため、operator &operator *はオーバーロードされません。そうしないと、同等性が保持されない可能性があります)。

実際、この表現:

*(&pointer) // Evaluates to the address of j

最初のアドレスを計算してpointerから逆参照します。これにより、 のアドレスであるのが得られます(それが の初期化方法であるため)。一方、この式は次のようになります。pointerjpointer

&(*pointer) // Evaluates to the address of j

最初に逆参照pointer( への参照を与えるj) を行い、次にそのアドレスを取得します (したがって、 のアドレスに評価されますj)。

ご覧のとおり、どちらの式も のアドレスに評価されるため、j同等です。

于 2013-04-08T14:55:02.437 に答える
2

C では、通常、型を右から左に読む方がはるかにうまくいきます。

 int *pointer = &j;

 (int *) = the pointer to an integer
 (&) = the address of

それで

 (&*) = the pointer to an address of
 (*&) = the address of a pointer

ポインターのアドレスはポインターに割り当て可能であり (任意のアドレスはポインターに割り当て可能)、任意のポインターもポインターであるため、割り当てが型ごとに機能するようになります (しかし、私はそうではありません)。非常に機能的だと思います)。

于 2013-04-08T14:54:49.580 に答える
1

他には何も意味がないので、それらは同一です。&*pointer-が指すオブジェクトのアドレスであり、pointerそれが値 (格納されているアドレス)pointerそのものです。

*&pointer(逆参照された変数pointerのアドレス) のアドレスが指すオブジェクトです - 繰り返しますが、それ自体です。pointerpointer

于 2013-04-08T14:54:52.003 に答える
1

*&pointerポインターアドレスを返し、次にそれが指すものを返します...しかし、これはアドレスではなく変数です。ここで私の疑問は...

これを 1 つずつ実行してみましょう。

  • &pointerint**であり、変数を指しpointerます。

  • *&pointerは上記を逆参照し、実質的に単に と同等ですpointer

于 2013-04-08T14:54:56.520 に答える