【问题标题】:Why can't pointer to pointer, access struct members without a cast?为什么不能指向指针,在没有强制转换的情况下访问结构成员?
【发布时间】:2019-10-22 10:07:35
【问题描述】:

在 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 工作时产生错误。为什么?

【问题讨论】:

  • 您能在问题中包含错误吗?
  • 你遇到什么样的错误?
  • Operator precedence。请注意,-> 的优先级高于 *
  • 不是演员表。如果您认为是演员表,请尝试使用((Node*)headref)->data 而不是((Node*)*headref)->data。它应该会严重失败。你写的演员阵容是空的。
  • @WhozCraig 谢谢。优先级是问题。

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


【解决方案1】:

这个表达式

*headref->data

等价于

*( headref->data )

与有效表达式不一样

( *headref )->data

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

这个表达式

((Node*)*headref)->data

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

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

如上所示。

【讨论】:

  • 啊,这解决了。谢谢。我将介绍运算符优先级。
【解决方案2】:

如果将运算符链接在一起,最好确保正确记住它们的优先级。如列出的hereoperator-> 的优先级高于间接*。因此

*headref->data

被解释为

*(headref->data)

这是行不通的。相反,使用

(*headref)->data

相当于((Node*)headref)->data

【讨论】:

    猜你喜欢
    • 2015-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-30
    • 1970-01-01
    • 2016-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多