4

如果我有:

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

那么如果我这样做:

&*pointer == *&pointer 

返回1( true)。

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

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

7 回答 7

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

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

    ┌──────────┐  ┌─────────┐  ┌───┐
    │ &pointer ┿━>│ pointer ┿━>│ j │
    └──────────┘  └─────────┘  └───┘
        (3.)         (4.)
    

您缺少的重要部分是address 的pointer地址,address 的地址也是int如此。取消对您的引用,这只会再次为您提供指针。&pointer

于 2013-04-08T14:54:10.903 回答
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然后取消引用它。这再次为您提供 的pointer即 的地址j(因为这就是您初始化 的方式pointer)。另一方面,这个表达式:

&(*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

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

于 2013-04-08T14:54:49.580 回答
1

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

*&pointerpointer是(被取消引用的pointer变量的地址)的地址所指向的对象- 同样,这就是pointer它本身。

于 2013-04-08T14:54:52.003 回答
1

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

让我们一步一步来:

  • &pointer是类型int**并指向pointer变量。

  • *&pointer取消引用上述内容,实际上等同于 simple pointer.

于 2013-04-08T14:54:56.520 回答
1

&*pointeris并返回指向 或&(*pointer)的值的地址。pointerpointer

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

于 2013-04-08T14:56:06.237 回答