我有一个如下所示的程序,当我尝试使用指针到指针访问结构成员时,它说表达式必须具有指向类类型的指针。请告诉我如何使用指针到指针访问结构对象的数据元素
#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=
完成作业
这些将按什么顺序发生?根据运算符优先级,其中指出:
>运算符 | |
---|---|
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;