如果我有:
int j = 8;
int *pointer = &j;
那么如果我这样做:
&*pointer == *&pointer
返回1
( true
)。
但我对第二个表达有疑问:
&*pointer
返回指针指向的地址(首先评估 * 然后 &)*&pointer
返回指针地址,然后返回它指向的内容......但这是变量而不是地址。所以这是我的疑问......
&*pointer
取消引用指针(下图中的 1.)以提供int
对象(2.),然后获取该对象的地址,该地址当然与指针(1.)的值相同。
┌─────────┐ ┌───┐
│ pointer ┿━>│ j │
└─────────┘ └───┘
(1.) (2.)
*&pointer
获取指针 (4.) 的地址以获取指向该指针 (3.) 的指针,然后取消引用该地址以再次获取指针 (4.)。
┌──────────┐ ┌─────────┐ ┌───┐
│ &pointer ┿━>│ pointer ┿━>│ j │
└──────────┘ └─────────┘ └───┘
(3.) (4.)
您缺少的重要部分是address 的pointer
地址,address 的地址也是int
如此。取消对您的引用,这只会再次为您提供指针。&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
由于指针的地址可以分配给指针(任何东西的地址都可以分配给指针),并且指向任何东西的指针也是指针,因此您将获得分配以按类型工作,(但我没有t认为它会非常实用)。
它们是相同的,因为没有其他任何意义。&*pointer
是 - 指向的对象的地址,pointer
这就是值(存储在其中的地址)pointer
本身。
*&pointer
pointer
是(被取消引用的pointer
变量的地址)的地址所指向的对象- 同样,这就是pointer
它本身。
*&pointer
返回指针地址,然后返回它指向的内容......但这是变量而不是地址。所以这是我的疑问......
让我们一步一步来:
&pointer
是类型int**
并指向pointer
变量。
*&pointer
取消引用上述内容,实际上等同于 simple pointer
.
&*pointer
is并返回指向 或&(*pointer)
的值的地址。pointer
pointer
*&pointer
is*(&pointer)
并返回&pointer
指向 或的值pointer
。