左值作为一元'&'操作数 - 作为指针传递函数结果

时间:2017-05-11 23:27:55

标签: c pointers


我的代码有问题。 有以下功能:

static Poly PolyFromCoeff(int coeff);
static Mono MonoFromPoly(const Poly *p, int exp);

在另一个函数中,我有这一行:

Mono m = MonoFromPoly(&PolyFromCoeff(10),4);

但我收到此错误消息:

  

左值作为一元'&'操作数

如果我将第一个结果保存到变量,则没有错误:

Poly p = PolyFromCoeff(10);
Mono m = MonoFromPoly(&p,4);

为什么第一个解决方案错了?

2 个答案:

答案 0 :(得分:2)

正如它所说,运算符&需要左值作为其参数,即它不能应用于临时值。地址不与值相关联,仅与对象关联。

在第二种形式中,您实例化一个包含该值的对象,您可以轻松获取该对象的地址。

答案 1 :(得分:1)

C语言明确禁止您获取 rvalue 的地址(这是函数返回的内容)。 C11 standard (committee draft)中的这一条款对其进行了总结:

  

6.5.3.2地址和间接运营商

     

<强>约束

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

如果您对 lvalue rvalue 感到困惑,请将其想象如下:

  • lvalue 具有标识符和存储
  • rvalue 是临时结果或文字值

如果你有C ++背景,你可能会感到困惑,因为引用的行为是不同的。在C ++中,可以这样做:

static Poly PolyFromCoeff(int coeff);
static Mono MonoFromPoly(const Poly &p, int exp);

Mono m = MonoFromPoly( PolyFromCoeff(10), 4 );