C将函数返回值的地址作为函数参数传递

时间:2013-06-28 15:02:00

标签: c function memory-address

我有两个功能:

void a(int * p);
int b();

是否可以将函数b的返回值的地址传递给函数a,如下所示:a(&b())

6 个答案:

答案 0 :(得分:11)

复合文字似乎可以解决问题(需要C99编译器):

int a()
{
    return 5;
}

void b(int *a)
{
    // do something with a
    printf("%d\n", *a);
}

int main(void)
{
    b(&(int){ a() });
}

输出为5

答案 1 :(得分:3)

仅使用临时变量:

int result = b();
a(&result);

编辑:显然还有一种方法可以使用复合文字来做到这一点,这里有另一个答案。

答案 2 :(得分:2)

不 - 那个返回值的地址是什么?您需要将返回值存储在变量中,然后在该变量中传递该变量的地址。

答案 3 :(得分:2)

没有。 C11说(强调我的):

  

6.5.3.2.1

     

一元&的操作数运算符应一个函数指示符 a [] 一元* 运算符的结果,或一个左值指定一个不是位字段且未使用寄存器存储类说明符声明的对象。

现在它显然不是一个功能,[]或一元*。让我们看看什么是左值

  

6.3.2.1

     

lvalue是一个潜在的表达式(对象类型不是void)   指定一个对象; 64)如果一个左值在评估时没有指定一个对象,那么   行为未定义。 ...

     

64)名称''左值''最初来自赋值表达式E1 = E2,其中左边   操作数E1必须是(可修改的)左值。它可能更好地被视为代表一个   对象''定位器值''。在本国际标准中描述的有时称为“右值”   作为''表达式的值''。

     

左值的一个明显例子是对象的标识符。作为另一个例子,如果E是一元的   表达式是指向对象的指针,* E是一个左值,用于指定E指向的对象。

简而言之,左值指定一个对象。由于b()未指定特定对象,因此它不是左值。您也可以通过查看b() = 2;错误来判断这一点。

答案 4 :(得分:1)

不,你不能在C中这样做。另请注意,C没有像C++中那样称为引用的内容。

因为C指针来实现相同的行为..

要在C中实现相同的目标,请使用临时变量,

int val;
val = b();
a( &val );    // & is called as "address of" operator in C

为了回答C中没有引用的原因,我的理解指针和引用意味着实现相同的目标 - 最小化或避免数据复制 。对于这个C的指针是足够好的,虽然技术上两者在C++ (参考)中有一些差异

答案 5 :(得分:0)

您可以将对b()的引用作为参数传递给a,然后从b致电a

void a(void (*b)(int)) {
   // call b
   int local_var = b(<something>);
}