使用指向指针的指针访问结构成员



我有一个如下所示的程序,当我尝试使用指针到指针访问结构成员时,它说表达式必须具有指向类类型的指针。请告诉我如何使用指针到指针访问结构对象的数据元素

#include "stdafx.h"
#include<iostream>
struct Node{
int data;
Node* next;
};
void addnode(Node** node, int val)
{
if (node == NULL){
*node = new Node();
*node->data = val;
}
}

int _tmain(int argc, _TCHAR* argv[])
{
Node* node;
addnode(&node, 10);
return 0;
}

*node->data = val;中,涉及 3 个运算符。

  • operator*取消引用
  • 访问成员operator->
  • operator=完成作业

这些将按什么顺序发生?根据运算符优先级,其中指出:

优先级>运算符>operator=
2 ;">operator->
3 ;">operator*
16

*node->data = val;等效于*(node->data) = val;,但你想要的是(*node)->data = val;(所以你需要添加参数)。

这是一个操作顺序的事情。它需要(*node)->data = val.另请注意,if语句正在执行与您想要的相反的操作:*node不是一个错误,您需要测试node不是null 而不是它是 null。

对于初学者,您需要在 main 中初始化指针节点

Node* node = nullptr;

其次,这个表达

*node->data = val;

相当于

* ( node->data ) = val;

由于运算符的优先级,因为包括运算符->的后缀运算符比一元运算符(如取消引用运算符*)具有更高的优先级。

至少你需要写

( *node )->data = val;

但无论如何,该功能都没有意义。

如果您需要将一个新节点添加到单向链表的开头,则该函数将如下所示

void addnode(Node** node, int val)
{
*node = new Node { val, *node };
}

或者不使用双指针,例如

void addnode( Node* &node, int val)
{
node = new Node { val, node };
}

在这种情况下,函数的调用方式如下

addnode(node, 10);

如果要将新节点附加到单向链表的末尾,那么在这种情况下,该函数可能如下所示

void addnode(Node** node, int val)
{
while ( *node ) node = &( *node )->next;
*node = new Node { val, *node };
}

问题是由于运算符优先级,语句*node->data = val;等效于:

*(node->data) = val;

上面的语句不起作用,因为取消引用node会给我们Node*它没有任何称为data的成员,因为它是非类类型。 要解决此问题,您需要通过在*node周围添加括号来覆盖此行为,如下所示:

(*node)->data = val;

此外,main中的变量node未初始化。您应该按如下所示对其进行初始化:

Node* node = nullptr;

相关内容

  • 没有找到相关文章

最新更新