c++指针疑点

C++ pointers doubts

本文关键字:指针 c++      更新时间:2023-10-16

我对我在大学里看到的这段代码有疑问。

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只是一个指针到第一个节点?

提前谢谢你。我用谷歌搜索了很多,但没有找到任何答案。如果你能回答我的问题,我将非常感激。

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

数据类型

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

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

  • 表达式((*aux)->next)数据类型为nodeList *, &((*aux)->next)数据类型为nodeList **。您使用&运算符来获取变量的内存地址,使用&的结果数据类型是多一个星号。
  • 表达式*aux的数据类型是nodeList *,因为aux是nodeList **,星号运算符通过指针获得指向元素的值,有效地从数据类型中删除一个星号。
void filter( List &l )

这意味着"按引用传递"而不是"按值传递",即传递指向对象l的指针而不是将l复制到堆栈中。就它在计算机上的实际工作方式而言,"void filter(List &l)"answers"void filter(List *l)"之间没有区别,因为它们最终都是传递给函数的指针。然而,从编码器的角度来看,"void filter(List &l)"的优点是编译器确保您不会得到'nullptr'。

List * aux = &l;

这意味着"给我一个指向对象l的指针"。符号"&"在C/c++中用于许多不同的事情,在这种情况下,它的意思是"给我地址"。aux是一个指向List类型对象的指针,而不是一个指向List类型对象的指针(当然这里的List本身就是一个指向nodeList的指针)。

aux = &((*aux)->next);

*aux是aux所指向的对象,它是一个"nodeList*"。(*aux)->next是aux所指向的List对象所指向的nodelist对象中的下一个指针。aux = &设置aux指针指向这个对象。

这段代码不是特别清晰或简洁,所以我假设这样写是作为一个教育工具,看看你是否理解C/c++中的指针、引用和地址。因此,也许您应该在C/c++指针教程中复习这些操作符的定义。

    我不知道,List * aux = &l;到底是做什么的。因为ListnodeList *相同,所以,代码将是nodeList * * aux = &l;,这实际上是我不明白的,是一个指针指向一个指针,该指针持有nodeList struct指针的地址吗?

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

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

aux是一个引用,所以作为参数l传递的原始指针将被改变。