使用一元&运算符函数返回值

时间:2012-07-09 15:05:32

标签: c function pointers unary-operator

我想申请一元'&'操作员只是在函数后面操作函数返回值。但是,我得到一个编译时错误(我使用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"()",其他地方没有其他代码?

5 个答案:

答案 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);
}