[英]accessing struct members using pointer to pointer
我有一個如下所示的程序,當我嘗試使用指向指針的指針訪問結構成員時,它說表達式必須具有指向 class 類型的指針。 請告訴我如何使用指向指針的指針訪問結構 object 的數據元素
#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 | operator= |
node->data
將首先發生,然后結果將被取消引用 - 所以你在左側有*(node->data)
。
您需要先取消引用node
,然后可以使用(
... )
覆蓋優先級規則:
(*node)->data = val;
另請注意,您的原始Node*
未初始化並讀取它(就像您在if(node == NULL)
中所做的那樣)將導致程序具有未定義的行為。 將其初始化為nullptr
:
Node* node = nullptr; // here
addnode(&node, 10);
*node->data = val;
等價於*(node->data) = val;
, 但你想要的是(*node)->data = val;
(所以你需要添加parens)。
這是一個操作順序的事情。 它需要是(*node)->data = val
。 另請注意, if
語句的作用與您想要的相反: *node
不是錯誤,您需要測試該node
不是null 而不是 null。
對於初學者,您需要在 main 中初始化指針節點
Node* node = nullptr;
其次這個表達
*node->data = val;
相當於
* ( node->data ) = val;
由於運算符的優先級,因為包括運算符->
在內的后綴運算符的優先級高於解引用運算符*
等一元運算符。
至少你需要寫
( *node )->data = val;
但無論如何 function 沒有任何意義。
如果您需要將新節點添加到單鏈表的開頭,那么 function 將如下所示
void addnode(Node** node, int val)
{
*node = new Node { val, *node };
}
或者不使用雙指針
void addnode( Node* &node, int val)
{
node = new Node { val, node };
}
在這種情況下,function 被稱為
addnode(node, 10);
如果你想 append 一個新節點到單鏈表的末尾那么在這種情況下 function 可以看起來像
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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.