【发布时间】:2021-05-13 16:32:58
【问题描述】:
考虑 if 语句:
if (((DbSignal*) ev->newVal.buff)->sig)
DbSignal 是一个结构体。
为什么 DbSignal 在方括号内,在这种情况下星号运算符在做什么?
【问题讨论】:
标签: c
考虑 if 语句:
if (((DbSignal*) ev->newVal.buff)->sig)
DbSignal 是一个结构体。
为什么 DbSignal 在方括号内,在这种情况下星号运算符在做什么?
【问题讨论】:
标签: c
我们有ev,在这种情况下是一个指针。
它指向一个包含变量newVal 的结构,其中包含一个buff 指针。
所以我们有ev->newVal.buff
这里的 buff 是 char* 或 void*(一系列字节,但显然有一些布局)。这意味着它指向的内存可能会以不同的方式解释。
通过你的例子,我们知道buff有一定的布局,对应DbSignal结构体。
因此,为了访问->sig,我们必须将.buff 转换为DbSignal,基本上是告诉我们要使用DbSignal 描述的布局来解释该内存区域。
希望这能提供一些背景信息。
【讨论】:
语法(DbSignal*) 是一种类型转换。它将一种类型转换为另一种类型。
在这种情况下,强制转换的操作数是ev->newVal.buff,它可能是一个指向字符缓冲区的指针。该指针通过强制转换转换为指向DbSignal 的指针。然后取消引用结果并访问sig 成员。
【讨论】:
ev 指向的结构中的newVal 指针将缓冲区替换为DbSignal,然后newVal 被取消引用以检索sig 值DbSignal?
newVal 指向的字节现在被视为DbSignal。
这是强制转换:ev->newVal.buff 被强制转换为指向 DbSignal 的指针。然后这个指针被取消引用(sig 成员被访问)
【讨论】: