函数可以返回两个值吗?

时间:2011-02-28 07:02:02

标签: c

  

可能重复:
  returning multiple values from a function

我有一个必须返回两个值的函数

                    return(&ptr->keys[pos].value)
                    return Duplicate;

这里& ptr->键[pos] .value将给出地址,Duplicate是枚举值设置为2 ...如何将这两个值返回到另一个函数,insert_front是一个链接列表this& amp ; ptr-> keys [pos] .value用作链表的第一个地址。 我应该写的调用函数的原型应该是什么?

7 个答案:

答案 0 :(得分:6)

您无法返回两个值。但是,您可以返回单个值,该值是包含两个值的结构。

答案 1 :(得分:4)

您只能从函数返回一件事。您可以创建一个包含要返回的所有内容的结构,也可以通过引用传递一些函数参数。

答案 2 :(得分:2)

罗伯特的代码是正确的。但是,您/可以/也使用没有malloc的结构,如下所示:

struct retstruct {
    int a;
    int b;
};
struct retstruct myfunc(void) {
    struct retstruct r;
    r.a = 1;
    r.b = 2;
    return r;
}

int main()
{
    struct retstruct r;
    r = myfunc();
    printf("a=%d  b=%d\n", r.a, r.b);
}

这通常是避免的,因为传递这样的结构通常会更加昂贵(性能方面),但如果你只需要这样的几个值,那就足够了。

答案 3 :(得分:1)

要返回两个值,您必须定义某种结构来保存这两个值,并返回该结构的一个实例。或者,您可以将一个或两个地址传递给函数,并让它在那里写入值。

答案 4 :(得分:1)

在C / C ++中,函数不能返回两个值。但是,大多数情况下,这种限制实际上是有道理的:在任何复杂的函数中,你想要更新一些数据(一堆变量,一个数组等),并返回函数的状态,即它是否成功或不。因此,一个好的做法是返回函数的状态,并使用引用(在C ++中)或指针(在C中)来修改您的参数,就像在C中的这个示例中一样:

int swap(int* a, int* b)
{
   int tmp = *a;
   *a = *b;
   *b = tmp;
   return 0;
}

当然,这个功能太简单而不能失败(有点),但你明白了:P

然后,如果你真的希望你的函数返回2个值,那么你可以使用其他回答者提出的所有技巧。

答案 5 :(得分:0)

像这样:

typedef ret {
    int val1;
    int *val2;
} ret_t ;

// make sure to remember to free the struct when you're done with it
ret_t *myFunc( void ) {
    ret_t *r = malloc( sizeof(ret_t) );
    r->val1 = 1;
    r->val2 = &r.val1;

    return r;
}

// You can also return a copy of the struct on the stack
ret_t myFunc( void ) {
    ret_t r;
    r.val1 = 1;
    r.val2 = &r.val1;

    return r;
}

答案 6 :(得分:0)

不,你不能在一个函数中有两个返回,第一个返回将退出你需要创建一个对象的函数。注意:我在很长一段时间内没有使用C编码,因此这里的语法可能已关闭。

public class link{
  private int& ptr;
  private int Duplicate;

  public constructor link() {}

  public setPtr(int& ptr) {
     this->&ptr = ptr;
  }

  //set duplicate function

  //get ptr function

  //get duplicate function

}

并在您发布的功能片段中创建链接对象之前设置所需的值,然后返回(链接对象);