5

我有两个功能:

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

是否可以将函数的返回值的地址传递给这样的b函数aa(&b())

4

6 回答 6

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

于 2013-06-28T15:12:50.763 回答
3

仅通过使用临时变量:

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

编辑:显然还有一种方法可以使用复合文字来执行此操作,此处的另一个答案中对此进行了描述。

于 2013-06-28T15:04:27.917 回答
2

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

于 2013-06-28T15:04:37.650 回答
2

C11 号说(强调我的):

6.5.3.2.1

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

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

6.3.2.1

左值是一个表达式(对象类型不是 void),它可能指定一个对象;64) 如果一个左值在计算时没有指定一个对象,则行为未定义。...

64) 名称“左值”最初来自赋值表达式 E1 = E2,其中要求左操作数 E1 是(可修改的)左值。将其视为表示对象“定位器值”可能更好。有时被称为“右值”的东西在本国际标准中被描述为“表达式的值”。

左值的一个明显示例是对象的标识符。再举一个例子,如果 E 是一个一元表达式,它是一个指向对象的指针,那么 *E 是一个左值,它指定 E 指向的对象。

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

于 2013-06-28T15:11:14.387 回答
1

不,你不能在C. 另请注意,C没有.C++

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

为了达到C使用临时变量的相同目标,例如,

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

要回答为什么没有引用C根据我的理解,指针和引用是为了达到相同的目标——最小化或避免数据复制。因为 thisC的指针已经足够好了,虽然在技术上两者有一些不同C++ (仅供参考)

于 2013-06-28T15:03:53.923 回答
0

您可以将引用b()作为参数传递给athen 调用bfrom a

void a(void (*b)(int)) {
   // call b
   int local_var = b(<something>);
}
于 2013-06-28T15:08:49.110 回答