【问题标题】:Why does C have both . and -> for addressing struct members? [duplicate]为什么 C 两者都有。和-> 用于寻址结构成员? [复制]
【发布时间】:2012-11-24 02:21:34
【问题描述】:

可能重复:
Why does the arrow (->) operator in C exist?

为什么 C 有 .-> 来寻址结构成员?

有没有可能有这样修改过的语言语法,我们可以将p作为一个指向struct的指针,并像p.value一样获取一个struct成员的值?

【问题讨论】:

  • -> 用于取消引用指针。
  • ptr->member 等同于 (*ptr).member,如果这有帮助的话,并回答你的结尾问题,不。
  • 另见stackoverflow.com/questions/1238613/…(对于C++,但答案是一样的)
  • 好的,所以 -> 似乎是一种语法糖,但为什么在语法级别上仍然无法将点应用于指针?
  • 这恰好是上周的热门话题。 stackoverflow.com/questions/13366083/…

标签: c


【解决方案1】:

您可以将p->m 视为(*p).m 的简写

【讨论】:

    【解决方案2】:

    来自 C99 规范。

    . 运算符的第一个操作数应具有合格或不合格的结构或联合 类型,第二个操作数应命名该类型的成员。

    -> 运算符的第一个操作数应具有类型 指向合格或不合格的指针 结构体指向合格或不合格联合体的指针,第二个操作数应 命名指向类型的成员。

    我的猜测是,出于识别目的,他们使用两个运算符来访问成员。即对于指针类型结构变量是->. 对于普通结构变量。

    例如:

    struct sample E, *E1;
    

    表达式(&E)->MOSE.MOS 相同,
    (*E1).MOSE1->MOS 相同

    【讨论】:

      【解决方案3】:

      有可能吗?可以。语法如下:

      (*ptr).member
      

      括号是必需的,因为结构成员运算符 . 的优先级高于间接运算符 *。但是使用几次后你会同意以下更容易使用:

      ptr->member
      

      为什么 C 中两者兼有?指向结构的指针在 C 中经常使用,因此创建了一个特殊的运算符,称为 结构指针运算符->。它的工作是更清楚、更方便地表达指向结构的指针。

      【讨论】:

        【解决方案4】:

        。用于结构变量,-> 用于指针。如果 p 是指针,你可以做 p->value 或 (*p).value,它们是一样的。

        【讨论】:

        • 好的,但是语言语法中有 p.value 有什么问题?
        • p.value 仅在 p 是结构变量时有效。编译器将检查 p 是什么。如果 p 是一个指针,并且你使用 p->value,那么编译会给你错误。
        • . 不是必须用于“结构变量”的,有联合。
        猜你喜欢
        • 2019-02-27
        • 2018-03-01
        • 1970-01-01
        • 2011-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多