这段与指针相关的代码有什么问题

What is wrong in this code related to pointer

/* The structure of the Linked list Node is as follows:

struct Node
{
    int val;
    struct Node *next;

    Node(int data){
        val = data;
        next = NULL;
    }

}; 
*/

void intersection(Node **head1, Node **head2,Node **head3)
{

    cout<<*head1->val;
}

上面的代码不起作用,但是当我使用另一个指针 Node* h1=*head1; 然后打印它的值时它工作正常。在这两个代码中,我要打印的值是相同的,那为什么上面的代码是错误的;

/* The structure of the Linked list Node is as follows:

struct Node
{
    int val;
    struct Node *next;

    Node(int data){
        val = data;
        next = NULL;
    }

}; 
*/

void intersection(Node **head1, Node **head2,Node **head3)
{

    Node* h1=*head1;
    cout<<h1->val;
}

在此代码段中

void intersection(Node **head1, Node **head2,Node **head3)
{

    cout<<*head1->val;
}

表达式

*head1->val

等同于

*( head1->val )

(因为后缀运算符->的优先级高于一元运算符*)但是指针head没有指向结构类型的对象。它指向另一个指针,你必须写

( *head1 )->val

这相当于带有中间变量的表达式h1

Node* h1 = ( *head1 );
h1->val;

为了使差异更明显,您可以按以下方式重写访问数据成员的表达式val

( **head ).val

现在表达式 **head 产生类型为 struct Node 的对象的 lvalue

或者使用像

这样的中间变量
Node *h1 = *head;
( *( h1 ) ).val
     ^
     |
   *head

运算符优先级将 -> 放在 * 之前。举例说明:

#include<iostream>

struct foo {
    int x;
};

int main() { 
    foo f;
    foo* fp = &f;
    foo** fpp = &fp;

    auto& xref = f.x;

    std::cout << &xref << "\n";
    //std::cout << *fpp->x;      // error
    std::cout << &(*fpp)->x;
}

标记为//error 的行无法编译,因为fpp 没有成员x。另外两行打印相同的地址,即 f.x.

的地址