C ++指针存在疑问

时间:2014-07-26 18:20:40

标签: c++ pointers struct

我对我在大学看到的这段代码表示怀疑。

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;实际上做了什么。因为ListnodeList *相同,所以代码将是nodeList * * aux = &l;,这实际上是我不理解的,是指向保存地址的指针的指针指针nodeList struct

  • 我理解的第二件事是最后一行。 aux = &((*aux)->next); 为什么aux左侧没有*?如果它被声明为List *aux = &l; List只是一个指向第一个节点的指针?

提前谢谢你。我google了很多,但我没有找到任何答案。如果你能回答我的问题,我会非常感激。

3 个答案:

答案 0 :(得分:5)

  1. 完全。

  2. 您应始终匹配数据类型。 auxnodeList **,因此任何赋值都应该具有相同的数据类型。由于((*aux)->next)nodeList *,因此您使用&运算符获取nodeList **

  3. <强>数据类型

    变量具有特定的数据类型。例如,auxList*,但ListnodeList*的别名,因此auxnodeList**

    但表达式也有数据类型作为一个整体。例如,

    • 表达式((*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;实际上做了什么。因为ListnodeList *相同,所以代码将是nodeList * * aux = &l;,这实际上是我不明白的,是指向一个指针的指针,该指针包含一个地址nodeList struct
  • 的指针   

它从参考参数获取等效指针的地址(因此实际上与nodeList**相同)。

  
      
  • 我理解的第二件事是最后一行。 aux = &((*aux)->next);   为什么aux左侧没有*?如果它被声明为List *aux = &l; List只是一个指向第一个节点的指针?
  •   

aux是一个引用,因此作为参数l传递的原始指针将被更改。