在一行中转换和引用

标签 c

检查代码:

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 初始化。因为它是左值,所以可以合法地获取地址。这将如您所愿地避免命名的临时文件。

只需确保您的编译器支持 或以后。

关于在一行中转换和引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50830843/

相关文章:

C语言中将一种数据结构复制到另一种数据结构

c - 将数据加载到结构数组 C 时出现段错误

c - 如果我们需要按特定顺序打印多线程计算的结果,为什么信号而不是广播有效?

c - 有没有办法确定apache模块的加载顺序

c++ - 在 C++/C 中在后台运行周期性循环

检查 CS50 哈佛现金应用程序中的 50 错误

c - 在 Mac 中使用 Xcode 进行 fopen

c - 在 C 中使用 fscanf,得到奇怪的输出

c++ - 特定地址空间的预处理器指令

c - 在C中初始化库外.lib的函数指针