C 如何以正确的方式投射void**指针?

C 如何以正确的方式投射void**指针?,c,casting,operator-precedence,C,Casting,Operator Precedence,鉴于此 void func(void **structs) { UI_Remote_s* a1 = (UI_Remote_s*)structs->Method; //expression UI_Remote_s* a2 = ((UI_Remote_s*)structs)->Method; //correct } 第一次尝试是错误的。为什么?我不会使用这种类型的转换,因为它使代码更难阅读。而是使用一个临时变量来存储指针。这将使代

鉴于此

void func(void **structs)
{
    
    UI_Remote_s* a1 = (UI_Remote_s*)structs->Method;         //expression 
    UI_Remote_s* a2 = ((UI_Remote_s*)structs)->Method;       //correct
}

第一次尝试是错误的。为什么?

我不会使用这种类型的转换,因为它使代码更难阅读。而是使用一个临时变量来存储指针。这将使代码更容易阅读和理解。编译器很可能会在生成的代码中优化它

UI_Remote_s **ptr = (UI_Remote_s **)structs;
a2 = (*ptr) -> Method;
a2 = (*(ptr + 5)) -> Method;
a2 = ptr[2] -> Method;
.....

如果在问题中包含实际的错误文本,而不仅仅是
//编译器错误
,您可能会发现您的问题已经得到了回答。您感到困惑的是,括号本身并不是类型转换。它们的内部在
->
之前进行评估,这是真的,但这只会给出强制转换的目标类型。评估
()
的内部不会执行cast.Hi。为了使问题更清楚易读,我对其进行了编辑。如果你这样认为,请投赞成票。你能给我一些改善环境的方向吗?为了清晰起见,我已经更改了标题和上下文,但否决票仍然在这里。