如果我有:
int j = 8;
int *pointer = &j;
Run Code Online (Sandbox Code Playgroud)
如果我这样做:
&*pointer == *&pointer
Run Code Online (Sandbox Code Playgroud)
返回1(true).
但我对第二个表达有疑问:
&*pointer 返回指针指向的地址(首先评估*然后&)*&pointer返回指针地址然后指向它...但这是变量而不是地址.所以这是我的怀疑......&*pointer取消引用指针(下图中的1.)为您提供int对象(2.),然后获取该对象的地址,当然该值与指针(1.)相同.
??????????? ?????
? pointer ??>? j ?
??????????? ?????
(1.) (2.)
Run Code Online (Sandbox Code Playgroud)*&pointer 获取指针(4.)的地址以获得指向该指针(3.)的指针,然后取消引用该地址以再次获得指针(4.).
???????????? ??????????? ?????
? &pointer ??>? pointer ??>? j ?
???????????? ??????????? ?????
(3.) (4.)
Run Code Online (Sandbox Code Playgroud)你缺少的重要组成部分,是pointer为的地址int,因此&pointer是地址的地址.取消引用你只是再次给你指针.
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)
| 归档时间: |
|
| 查看次数: |
6068 次 |
| 最近记录: |