【问题标题】:C++ pointers doubtsC++指针的疑惑
【发布时间】:2014-07-26 18:20:39
【问题描述】:

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

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了很多,但我没有找到任何答案。如果您能回答我的问题,我将不胜感激。

【问题讨论】:

  • 也许这行:typedef nodeList * List; 本来应该写成typedef nodeList List; 然后很多事情似乎可以理解。
  • 不,那一行是*我输入的,它可以工作。去掉高于 3 的值

标签: c++ pointers struct


【解决方案1】:
  1. 没错。

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

数据类型

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

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

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

【讨论】:

  • 我不明白对不起...(aux是“nodelist *”)和“*aux”是不是“nodelist **”?
【解决方案2】:
void filter( List &l )

这意味着“按引用传递”而不是“按值传递”,即传递指向对象 l 的指针而不是将 l 复制到堆栈。就它在计算机上的实际工作方式而言,“void filter(List &l)”和“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 对象中的 next 指针。 aux = & 设置 aux 指针指向这个对象。

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

【讨论】:

  • 感谢您的回答。在我意识到第一行可以写成 List * aux; 之后,我更好地理解了最后一行。辅助 = & l;我没有考虑到当你做 List * aux = &l;你正在做这两行。再次感谢您。
【解决方案3】:
  • 我不知道,List * aux = &l; 实际上是做什么的。因为ListnodeList * 相同,所以代码将是nodeList * * aux = &l;,这实际上是我不明白的,是指向包含nodeList struct 指针地址的指针的指针?

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多