我有两个功能:
void a(int * p);
int b();
是否可以将函数的返回值的地址传递给这样的b
函数a
:a(&b())
?
复合文字似乎可以解决问题(需要 C99 编译器):
int a()
{
return 5;
}
void b(int *a)
{
// do something with a
printf("%d\n", *a);
}
int main(void)
{
b(&(int){ a() });
}
输出是5
。
仅通过使用临时变量:
int result = b();
a(&result);
编辑:显然还有一种方法可以使用复合文字来执行此操作,此处的另一个答案中对此进行了描述。
不——那个返回值的地址是什么?您需要将返回值存储在一个变量中,然后传入该变量的地址。
C11 号说(强调我的):
6.5.3.2.1
一元 & 运算符的操作数应为函数指示符、[]或一元 *运算符的结果,或指定不是位域且未使用寄存器存储类说明符声明的对象的左值.
现在它显然不是一个函数,一个[]
或一元*
。让我们看看什么是左值:
6.3.2.1
左值是一个表达式(对象类型不是 void),它可能指定一个对象;64) 如果一个左值在计算时没有指定一个对象,则行为未定义。...
64) 名称“左值”最初来自赋值表达式 E1 = E2,其中要求左操作数 E1 是(可修改的)左值。将其视为表示对象“定位器值”可能更好。有时被称为“右值”的东西在本国际标准中被描述为“表达式的值”。
左值的一个明显示例是对象的标识符。再举一个例子,如果 E 是一个一元表达式,它是一个指向对象的指针,那么 *E 是一个左值,它指定 E 指向的对象。
所以简而言之,左值指定一个对象。由于b()
不指定特定对象,因此它不是左值。你也可以通过看到那b() = 2;
是错误的来判断这一点。
不,你不能在C
. 另请注意,C
没有像.C++
因为那C
有实现相同行为的指针..
为了达到C
使用临时变量的相同目标,例如,
int val;
val = b();
a( &val ); // & is called as "address of" operator in C
要回答为什么没有引用,C
根据我的理解,指针和引用是为了达到相同的目标——最小化或避免数据复制。因为 thisC
的指针已经足够好了,虽然在技术上两者有一些不同C++
(仅供参考)
您可以将引用b()
作为参数传递给a
then 调用b
from a
:
void a(void (*b)(int)) {
// call b
int local_var = b(<something>);
}