如何从函数返回两个值?

Abh*_*eet 18 c function

可能重复:
从函数返回多个值

假设我已将两个值传递给函数,iCalculate(int x, int y)iCalculate返回两个值.具体如下: -

  • (X*Y)
  • (X/Y)

现在我应该如何使用相同的函数同时返回上述两个值?

我的方法是: -

int* iCalculate(int x,int y){
   int temp[2];
   temp[0] = x*y;
   temp[1] = x/y;
   return temp;
}
Run Code Online (Sandbox Code Playgroud)

Arm*_*yan 29

返回本地数组的第一个元素的地址具有未定义的行为(至少在以后取消引用它).

您可以使用输出参数,即传递两个指针,并在其中设置值

void Calculate(int x, int y, int* prod, int* quot)
{
    *prod = x*y;
    *quot = x/y;
}
Run Code Online (Sandbox Code Playgroud)

用法:

int x = 10,y = 2, prod, quot;
Calculate(x, y, &prod, &quot)
Run Code Online (Sandbox Code Playgroud)

您可以做的另一件事是将数据打包到结构中

typedef struct 
{
    int prod;
    int quot;
} product_and_quot;


product_and_quot Calculate(int x, int y)
{
    product_and_quot p = {x*y, x/y};
    return p;
}
Run Code Online (Sandbox Code Playgroud)

  • 但是对于`struct`返回选项并不比我快.对于C程序员来说,他们总是首先考虑指针解决方案,而第二个简单解决方案是什么?;) (12认同)
  • 快点+1 5秒...... (2认同)
  • @Dave:只有当你通过指针传递`struct`*时,即让客户负责分配它.让我们看看我们已经获得了什么:我们不再复制两个32位整数,而是只复制一个32位指针.它只需要一个额外的声明,一个`&`操作符和两个dereferences.不,等待,32位指针,这是昔日的硬件...... (2认同)

Fre*_*Foo 11

这将无法工作,因为您正在返回一个指向临时数组的指针,该指针将在函数返回时停止存在.

相反,定义

typedef struct { int first, second; } IntPair;
Run Code Online (Sandbox Code Playgroud)

并返回该类型的对象.

(这是标准库的功能divldiv作用,除了它们以不同的方式调用类型.)

  • `div`和`ldiv`,最重要的.大多数其他人通过指针返回,虽然这在现代机器上并不是必需的(它曾经是一种优化). (3认同)