如果我有:
int j = 8;
int *pointer = &j;
然后,如果我这样做:
&*pointer == *&pointer
返回1
(true
)。
但我对第二个表达有疑问:
&*pointer
返回指针指向的地址(首先评估*
然后&)*&pointer
返回指针地址,然后返回它指向的内容......但这是变量而不是地址。所以这是我的疑问...... 答案 0 :(得分:8)
&*pointer
取消引用指针(下图中的1.)为您提供int
对象(2.),然后获取该对象的地址,当然这是与指针(1。)相同的值。
┌─────────┐ ┌───┐
│ pointer ┿━>│ j │
└─────────┘ └───┘
(1.) (2.)
*&pointer
获取指针(4.)的地址以获取指向该指针的指针(3.),然后取消引用该地址以再次获取指针(4.)。
┌──────────┐ ┌─────────┐ ┌───┐
│ &pointer ┿━>│ pointer ┿━>│ j │
└──────────┘ └─────────┘ └───┘
(3.) (4.)
您遗漏的重要部分是pointer
是int
的地址,因此&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)
他们是完全相同的,因为没有别的意义。 &*pointer
是pointer
指向的对象的地址 - 这是pointer
本身的值(存储在其中的地址)。
*&pointer
是pointer
地址所指向的对象(已解除引用的pointer
变量的地址) - 再次,pointer
本身。
答案 5 :(得分:1)
*&pointer
返回指针地址,然后返回它指向的内容......但这是变量而不是地址。所以这是我的疑问......
让我们一步一步:
&pointer
的类型为int**
,并指向pointer
变量。
*&pointer
取消引用上述内容,实际上只相当于pointer
。
答案 6 :(得分:1)
&*pointer
为&(*pointer)
,并返回pointer
指向的值的地址,或pointer
。
*&pointer
为*(&pointer)
,并返回&pointer
指向的值,或pointer
。