簡體   English   中英

使用指向指針的指針訪問結構成員

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM