我对我在大学看到的这段代码表示怀疑。
struct nodeList{
int data;
nodeList * next;
};
typedef nodeList * List;
void filter( List &l )
{
List * aux = &l;
while(*aux)
{
if( (*aux)->data > 3 )
{
List toDelete = *aux;
*aux = (*aux)->next;
delete toDelete;
}
else
{
aux = &((*aux)->next);
}
}
}
我不知道List * aux = &l;
实际上做了什么。因为List
与nodeList *
相同,所以代码将是nodeList * * aux = &l;
,这实际上是我不理解的,是指向保存地址的指针的指针指针nodeList struct
?
我理解的第二件事是最后一行。 aux = &((*aux)->next);
为什么aux
左侧没有*
?如果它被声明为List *aux = &l;
List
只是一个指向第一个节点的指针?
提前谢谢你。我google了很多,但我没有找到任何答案。如果你能回答我的问题,我会非常感激。
答案 0 :(得分:5)
完全。
您应始终匹配数据类型。 aux
是nodeList **
,因此任何赋值都应该具有相同的数据类型。由于((*aux)->next)
为nodeList *
,因此您使用&
运算符获取nodeList **
。
<强>数据类型强>
变量具有特定的数据类型。例如,aux
是List*
,但List
是nodeList*
的别名,因此aux
是nodeList**
。
但表达式也有数据类型作为一个整体。例如,
((*aux)->next)
的数据类型为nodeList *
,&((*aux)->next)
的数据类型为nodeList **
。您使用运算符&
来获取变量的内存地址,使用&
的结果数据类型是另一个星。*aux
的数据类型为nodeList *
,因为aux为nodeList **
,并且星型运算符通过指针获取指向元素的值,从而有效地从数据类型中删除一个星号。 答案 1 :(得分:2)
void filter( List &l )
这意味着&#34;通过引用传递&#34;而不是&#34;按值&#34;,即将指针传递给对象l而不是将l复制到堆栈。就其在计算机上的实际工作方式而言,&#34; void filter(List&amp; l)&#34;之间没有区别。和&#34; void filter(List * l)&#34;因为它们最终都成为传递给函数的指针。然而,从编码器的角度来看,&#34; void filter(List&amp; l)&#34;有一个优点,编译器可以确保您不会获得“nullptr”。
List * aux = &l;
这意味着&#34;给我一个指向对象l&#34;的指针。符号&#34;&amp;&#34;用于C / C ++中的许多不同的东西,在这种情况下,它意味着&#34;给我&#34;的地址。 aux
是指向List类型的对象的指针,而不是List类型的对象(当然List这里本身就是指向nodeList的指针)。
aux = &((*aux)->next);
*aux
是aux指向的对象,它是&#34; nodeList *&#34;。 (*aux)->next
是由aux指向的List对象指向的nodelist对象中的下一个指针。 aux = &
将aux指针设置为指向此对象。
此代码段不是特别清晰或简洁,因此我假设它以这种方式编写为一种教育工具,以查看您是否理解C /中的指针,引用和地址C ++。因此,也许您应该在C / C ++中的指针教程中查看这些运算符的定义。
答案 2 :(得分:1)
- 我不知道,
的指针List * aux = &l;
实际上做了什么。因为List
与nodeList *
相同,所以代码将是nodeList * * aux = &l;
,这实际上是我不明白的,是指向一个指针的指针,该指针包含一个地址nodeList struct
?
它从参考参数获取等效指针的地址(因此实际上与nodeList**
相同)。
- 我理解的第二件事是最后一行。
aux = &((*aux)->next);
为什么aux
左侧没有*
?如果它被声明为List *aux = &l;
List
只是一个指向第一个节点的指针?
aux
是一个引用,因此作为参数l
传递的原始指针将被更改。