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

时间:2013-04-08 14:51:28

标签: c++ c pointers

如果我有:

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

然后,如果我这样做:

&*pointer == *&pointer 

返回1true)。

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

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

7 个答案:

答案 0 :(得分:8)

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

    ┌─────────┐  ┌───┐
    │ pointer ┿━>│ j │
    └─────────┘  └───┘
        (1.)     (2.)
    
  2. *&pointer获取指针(4.)的地址以获取指向该指针的指针(3.),然后取消引用该地址以再次获取指针(4.)。

    ┌──────────┐  ┌─────────┐  ┌───┐
    │ &pointer ┿━>│ pointer ┿━>│ j │
    └──────────┘  └─────────┘  └───┘
        (3.)         (4.)
    
  3. 您遗漏的重要部分是pointerint的地址,因此&pointer是地址的地址。取消引用你只是再次给你指针。

答案 1 :(得分:4)

只要pointer是指向基本类型的原始指针(因此operator &operator * 重载,这些表达式是等效的,否则等价可能不成立)。

实际上,这个表达式:

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

首先计算pointer的地址,然后取消引用它。这再次为您提供pointer,这是[{1}}的地址(因为这是您初始化j的方式)。另一方面,这个表达式:

pointer

首先取消引用&(*pointer) // Evaluates to the address of j (提供对pointer的引用)然后获取其地址(从而评估j的地址。)

正如您所看到的,两个表达式都评估为j的地址,因此它们是等效的。

答案 2 :(得分:4)

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 |         
                                        +------------+

答案 3 :(得分: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

由于指针的地址可分配给指针(任何东西的地址都可分配给指针),并且指向任何东西的指针也是指针,因此您将使分配按类型工作(但是我不认为它会非常实用。)

答案 4 :(得分:1)

他们是完全相同的,因为没有别的意义。 &*pointerpointer指向的对象的地址 - 这是pointer本身的值(存储在其中的地址)。

*&pointerpointer地址所指向的对象(已解除引用的pointer变量的地址) - 再次,pointer本身。

答案 5 :(得分:1)

  

*&pointer返回指针地址,然后返回它指向的内容......但这是变量而不是地址。所以这是我的疑问......

让我们一步一步:

  • &pointer的类型为int**,并指向pointer变量。

  • *&pointer取消引用上述内容,实际上只相当于pointer

答案 6 :(得分:1)

&*pointer&(*pointer),并返回pointer指向的值的地址,或pointer

*&pointer*(&pointer),并返回&pointer指向的值,或pointer