如何阅读这些表达式:*&指针VS&*指针

xde*_*000 4 c c++ pointers

如果我有:

int j = 8;
int *pointer = &j;
Run Code Online (Sandbox Code Playgroud)

如果我这样做:

&*pointer == *&pointer 
Run Code Online (Sandbox Code Playgroud)

返回1(true).

但我对第二个表达有疑问:

  1. &*pointer 返回指针指向的地址(首先评估*然后&)
  2. *&pointer返回指针地址然后指向它...但这是变量而不是地址.所以这是我的怀疑......

Jos*_*eld 8

  1. &*pointer取消引用指针(下图中的1.)为您提供int对象(2.),然后获取该对象的地址,当然该值与指针(1.)相同.

    ???????????  ?????
    ? pointer ??>? j ?
    ???????????  ?????
        (1.)     (2.)
    
    Run Code Online (Sandbox Code Playgroud)
  2. *&pointer 获取指针(4.)的地址以获得指向该指针(3.)的指针,然后取消引用该地址以再次获得指针(4.).

    ????????????  ???????????  ?????
    ? &pointer ??>? pointer ??>? j ?
    ????????????  ???????????  ?????
        (3.)         (4.)
    
    Run Code Online (Sandbox Code Playgroud)

你缺少的重要组成部分,是pointer为的地址int,因此&pointer地址的地址.取消引用你只是再次给你指针.


Mik*_*ike 5

pointer“指向”内存中的某个地址;它驻留在内存中的某个其他地址。

&*pointer // (*pointer) - dereference `pointer`, now you have `j`
          // &(*pointer) - the address of `j`(that's the data that `pointer` has)
Run Code Online (Sandbox Code Playgroud)

然而:

*&pointer //(&pointer) - the address of pointer(where pointer resides in memory)
          // *(&pointer) - deference that address and you get `pointer`
Run Code Online (Sandbox Code Playgroud)

总是发现用图片更容易追踪指针,所以也许这个插图将有助于理解为什么它们是相同的:

//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 |         
                                        +------------+
Run Code Online (Sandbox Code Playgroud)