【问题标题】:Parentheses around structure variable with asterisk operator带有星号运算符的结构变量的括号
【发布时间】:2021-05-13 16:32:58
【问题描述】:

考虑 if 语句: if (((DbSignal*) ev->newVal.buff)->sig)

DbSignal 是一个结构体。

为什么 DbSignal 在方括号内,在这种情况下星号运算符在做什么?

【问题讨论】:

    标签: c


    【解决方案1】:

    我们有ev,在这种情况下是一个指针。 它指向一个包含变量newVal 的结构,其中包含一个buff 指针。

    所以我们有ev->newVal.buff

    这里的 buff 是 char*void*(一系列字节,但显然有一些布局)。这意味着它指向的内存可能会以不同的方式解释。

    通过你的例子,我们知道buff有一定的布局,对应DbSignal结构体。

    因此,为了访问->sig,我们必须将.buff 转换为DbSignal,基本上是告诉我们要使用DbSignal 描述的布局来解释该内存区域。

    希望这能提供一些背景信息。

    【讨论】:

      【解决方案2】:

      语法(DbSignal*) 是一种类型转换。它将一种类型转换为另一种类型。

      在这种情况下,强制转换的操作数是ev->newVal.buff,它可能是一个指向字符缓冲区的指针。该指针通过强制转换转换为指向DbSignal 的指针。然后取消引用结果并访问sig 成员。

      【讨论】:

      • 为澄清起见,ev 指向的结构中的newVal 指针将缓冲区替换为DbSignal,然后newVal 被取消引用以检索sigDbSignal?
      • @IllyaKara 它没有被替换,而是被重新解释为不同的类型。因此newVal 指向的字节现在被视为DbSignal
      【解决方案3】:

      这是强制转换:ev->newVal.buff 被强制转换为指向 DbSignal 的指针。然后这个指针被取消引用(sig 成员被访问)

      什么是类型转换:What exactly is a type cast in C/C++?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-16
        • 2013-08-04
        • 1970-01-01
        • 2012-05-08
        • 2021-12-12
        • 2022-11-16
        • 1970-01-01
        • 2011-11-30
        相关资源
        最近更新 更多