为什么指针不能在没有强制转换的情况下访问指针成员?

时间:2019-10-22 10:07:35

标签: c++ pointers operator-precedence unary-operator

在C ++中,我试图通过双指针headref访问结构成员,如下所示

struct Node{
    int data; 
    struct Node* next; 
};

struct Node* head = new Node;
head->data = 10; 
head->next = NULL; 

struct Node** headref = &head; 

但是,以*headref->data进行访问会在投射((Node*)*headref)->data时产生错误。为什么?

2 个答案:

答案 0 :(得分:10)

此表达式

*headref->data

等同于

*( headref->data )

它与有效表达式不同

( *headref )->data

因为数据成员data没有指针类型,并且您不能对其应用一元运算符*。

此表达式

((Node*)*headref)->data

有效不是由于强制转换。这是有效的,因为如果删除多余的转换,您将获得有效的edxpression

( /*(Node*)*/ *headref)->data

如上所示。

答案 1 :(得分:3)

如果将运算符链接在一起,确保正确记住它们的优先级始终是一个好主意。如列出的hereoperator->的优先级比间接*高。因此

*headref->data

被解释为

*(headref->data)

这是行不通的。而是使用

(*headref)->data

等效于((Node*)headref)->data