检查代码:
void mem_set( void** mem_input, void** mem_current )
{
*mem_input = *mem_current;
...
}
main()
{
...
void* mem_pos = ...;
float* cb_p = ...;
void* temp = (void*)cb_p;
mem_set( ( &temp, &mem_pos ); // works, but clumsy
}
我想避免在调用 mem_set
时必须创建和填充临时变量(因为我有很多 mem_set
调用)。电话能否以某种方式在一条线上完成?
mem_set( ( &( (void*)cb_p ), &mem_pos )
不起作用。
附注
请建议一个更好的问题标题。
最佳答案
类型转换 &cb_p
是不明智的。 float**
和 void**
不是兼容的指针类型。 “所有指针都相同”的假设通常不需要成立。
然而,您可以做一些看起来几乎像类型转换,但实际上不是类型转换的事情。您可以使用复合文字。与强制转换产生的常规值不同,该表达式创建了一个左值。您可以获取左值的地址:
mem_set( &(void*){cb_p}, &mem_pos );
(void*){cb_p}
产生一个未命名的 void 指针(这是复合文字表达式),它从 cb_p
初始化。因为它是左值,所以可以合法地获取地址。这将如您所愿地避免命名的临时文件。
只需确保您的编译器支持 c99或以后。
关于在一行中转换和引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50830843/