c语言 - 指针指向指针的类型 &head 如何?



假设我们有一个名为的指针

struct node *head

当将其称为&head时,类型变为指向指针的指针(结构节点**),为什么是这样?

想象一个现实生活激光指示器。

你可以把它指向汽车(car *),指向鸽子(pigeon *)。。。,到任何东西(void *)。

现在使用激光指示器指向指向汽车的激光指示器(car **)。

当然,在现实生活中,你可以将相同的激光指向汽车或鸽子等……但在C中,这是无效的:car *不能指向鸽子等。

您也可以关闭激光指示器(pointer = NULL; /* :-) */)

无论何时获取T类型的地址,结果都是T*类型。

因此,如果head的类型是struct Node *,则&head的类型必须是struct Node **

我们所做的只是引用指针的地址,这意味着它是一个指针,对吧?

它们都是指针,但它们不是指向同一类事物的指针。head包含指向Node结构的指针,但&head包含指向变量的指针"指针的地址";与";指针的内容";,即使内容是指针。

struct node *head;

这意味着CCD_ 19是指向CCD_ 20的指针。那么,head内容将是node的<em]地址>。

现在,考虑一下:struct node** p = &head;表达式&head计算为head的地址,即,包含node的地址的对象的地址。这就是为什么p的类型是指向指针的指针。

假设以下声明:

T x; // for some arbitrary type T

表达式x的类型为T,因此表达&x1产生类型为T *的值(指向T的指针)。这适用于任何类型的T

现在,让我们将T替换为指针类型P *:

P *x; // T -> P *

表达式&x产生类型为P **的值(T * -> (P *) * == P **)。

因此,是的,表达式&head将产生一个类型为struct node **的值,其值将与head不同。

多重间接在C中经常出现。一开始看起来很奇怪,但你很快就会掌握窍门。


  1. 一元运算符的操作数应为函数指示符[]或一元*运算符,或指定不是位字段且为未使用register存储类说明符声明-C 2011 Online Draft,§6.5.3.2地址和间接运算符

最新更新