我想申请一元'&'操作员只是在函数后面操作函数返回值。但是,我得到一个编译时错误(我使用MinGW的gcc)
test.c:在功能' main':
test.c:8:12:错误:左值作为一元'&'操作数
我制作了一个代码,让我的问题更容易理解:
int function();
void function2(int *param);
main()
{
function2(&function1());
}
int function1()
{
return 10;
}
void function2(int *param)
{
return;
}
此代码会产生相同的编译时错误。
问题是: 我如何使用'&'运算符只是来自function2"()",其他地方没有其他代码?
答案 0 :(得分:12)
您可以通过以下方式在C99及更高版本中实现您的目标:
function2((int[]){function1()});
即。制作包含函数返回值的复合文字。
答案 1 :(得分:11)
你做不到。函数的返回值是值,但不是对象。它在内存中没有指定的位置,没有地址,所以你不能指向它。相反,你可以写:
int a = function1();
function2(&a);
答案 2 :(得分:3)
问题是&
获取变量的地址。函数的返回值不一定存储在内存中。换句话说,它不是lvalue
(你不能把它放在=
的左侧)。因此,询问其地址是没有意义的(因为它不存在)。
您应该做的是以下内容:
int result = function1();
function2(&result);
C11标准将6.3.2.1中的lvalue
定义为:
lvalue是一个潜在的表达式(对象类型不是void) 指定一个对象; (脚注:名称''左值''最初来自赋值表达式E1 = E2,左边是 操作数E1必须是(可修改的)左值。它可能更好地被视为代表一个 对象''定位器值''。在本国际标准中描述的有时称为“右值” 作为''表达的价值'')
在同一标准中,在6.5.3.2中它说:
一元&的操作数运算符应该是函数指示符,是a的结果 []或一元*运算符,或指定不是位字段的对象的左值 未使用寄存器存储类说明符声明。
答案 3 :(得分:2)
您无法获取函数返回的值的地址。
如果该值通过CPU寄存器传回给调用者怎么办?
使function2()使用function1()的结果的唯一方法是使用一个中间变量,它恰好在内存中有一个地址。
main()
{
int a;
a = function1();
function2(&a);
}
答案 4 :(得分:1)
你不能直接这样做。函数返回值可以存储在堆栈中(并且很快将在另一个函数调用中被覆盖),或者可能存储在寄存器等中(取决于调用约定)。
你可能不想直接访问任何一个地方,它甚至没有多大意义(好吧,除非你真的知道你正在做什么)。
您使用的函数的返回值是右值(嗯......只是一个值),而'&'正如您在编译器输出中看到的那样,运算符需要左值(您可以分配给它)。因此,只需将返回值存储在变量(' main()'中的局部变量中,然后获取其地址)。
int main() {
int x = function1();
function2(&x);
}