我的理解是 &x 返回指针 x 的地址,*&x 也返回 x 指向的地址,它返回一个地址而不是另一个指针。那么类型如何成为指向指针的指针呢?据我所知:
让我们一步一步地完成这个过程,并确保我们对所有术语都准确无误。
x
属于类型struct node *
,即指向节点的指针。因此,它是一个指针。
&x
is an 表达(同样的方式1 + 2
是一个表达式)。表达式不会“返回”任何内容;他们评估为一些结果有value and a type。在这种情况下,我们应用&
运算符至x
。结果值有一个type指向节点的指针(在 C 语法中,struct node**
)。您不需要做任何困难的思考就可以理解这一点:由以下结果产生的类型&
是指向-的指针(无论该事物的类型是什么)&
适用于)。在我们的例子中,(无论该事物的类型是什么)&
适用于)是“指向节点的指针”,我们直接将其替换为:typeof(&x)
is (typeof x)*
这是(struct node *)*
这是struct node **
。 (我认为你实际上不能使用(typeof x)*
作为类型声明;我只是用看起来有点像 C 语言的东西来展示类型演算。)
The value该表达式的地址是现有的x
多变的。那是what &
does。这里的问题是“地址而不是另一个指针”没有意义,因为“地址”不是一种不同的类型。当我们说“x的地址”时,我们的意思是“一个具有指针类型的东西(无论x的类型是什么),以及一个告诉我们x在内存中的位置的值”。
当我们写的时候*&x
,这是另一个表达式,我们在其中应用*
子表达式的运算符&x
。从功能上来说,*
撤销的效果&
;它的意思是“指定位置的东西”,并且该类型具有一级“指针”removed.
取消引用 x 与 *x 相同,其类型为 (struct node *)
小心你的语言。*x
确实“与取消引用 x 相同”,也就是说,它是我们表达的方式代码中的这个想法。x
是一个类型的指针struct node *
; thus, *x
是指向的值,类型为struct node
.
printf("\n&x address is: %p\n", &x);
printf("*&x address is: %p\n", *&x);
我想这就是你自己困惑的地方。你标记为的东西"&x address"
不是地址&x
, 但反而&x
本身,即地址x
。 (就像第一个中的那样printf
你打印了同样的东西 -&x
- 并将其标记为“x的地址”。)当然打印*&x
给你和打印一样的东西&y
, 因为*&x
只是x
(the *
撤消&
),即&y
(因为就是这样x
已初始化)。您甚至不需要考虑类型就可以进行这种推理(尽管您will从长远来看,需要考虑类型,以便编写正确的代码)。
当然,也有局限性:你不能只写成对的&
and *
只要你愿意,就可以将它们组合在一起,然后将它们抵消。*
需要应用于指针,并使用&
稍后无法使您摆脱该要求。相似地,&
需要应用于具有定义位置的事物,并使用*
稍后无法使您摆脱该要求。特别是,您不能连续申请&&
到某物,因为第一个产生的地址&
是临时的,并且在概念上没有地址(在编译的代码中,它可能只出现在寄存器中并且永远不会写入内存)。