繁体   English   中英

从C或C ++中的函数返回多个数据项

[英]Returning multiple data items from a function in C or C++

我对我的几个作业问题感到困惑...你能使用return()从函数中返回多个数据项吗? 一个函数只能返回一个值,除非它是一个指向数组的指针吗?

我相信答案是函数可以通过返回结构返回多个数据项。 然后,返回指向数组的指针不是唯一的方法 - 如果这是一种方式?

但似乎有很多关于这个主题的讨论,所以我想确保我至少有基本的想法是正确的:你可以使用结构返回多个数据项但使用指针(我不明白)会使用记忆更有效率。 它是否正确?

使用C ++ 0x / C ++ 11,您可以使用:

#include <string>
#include <iostream>
#include <tuple>

using namespace std;

tuple<int, unsigned, string, int> getValues()
{
    return tuple<int, unsigned, string, int>(1, 2, "3", 4);
}

int main()
{
    int a;
    unsigned b;
    string c;
    int d;

    tie(a, b, c, d) = getValues();

    cout << a << ", " << b << ", " << c << ", " << d << endl;
    return 0;
}

用它编译

g++ tuple_test.cpp -std=c++0x -o tuple_test

并且,如果您运行该程序,它将输出:

1, 2, 3, 4

但是最好使用像这样的引用(我想说):

void getValues(int& a, unsigned& b, string& c, int& d)
{
    a = 1;
    b = 2;
    c = "3";
    d = 4;
}

int main()
{
    ...
    getValues(a, b, c, d)
    ...
}

这就是我没有仔细阅读的问题。

一个函数只能返回一个值,除非它是一个指向数组的指针吗?

是的,你只能返回1个单值,但是这个单值可以包含乘法值(struct,class,array)。

您可以使用结构返回多个数据项,但使用指针(我不明白这一点)将更有效地使用内存。 它是否正确?

真正。 但是当你使用指针时,它取决于你如何使用它。 当你动态分配它时,每个函数调用它都不会非常有效,你需要在使用后手动释放内存。 当您使用全局数组/结构时,它将是高效的。 但是当你多次调用函数时会给你带来问题。

除了在这个线程中已经说过的内容之外,在C ++ 11中你可以返回使用统一初始化初始化的结构:

struct XYZ {
    int x;
    int y;
    int z;
};

XYZ foo() {
    return {1, 2, 3};
}

我个人更喜欢返回带有命名成员而不是元组的结构,因为后者不为其成员提供名称。

那是正确的。

但是,您可以通过添加通过引用传递的参数来“返回”多个项目,然后将多个结果写入它们。

一个函数确实只能用return语句返回一个'thing'。 然而,那个东西可以是一个指针(C&C ++数组只是伪装的指针),一个引用(一个不能重命名或者数组索引的指针)或一个可以封装多个东西的对象。

如果你返回一个结构,你就会将整个结构传回去。 如果返回指针或引用,则只返回结构的地址 - 所以最好不要在函数返回时返回超出范围的结构的引用或指针! 这样做会调用未定义的行为,这很可能(但并非总是)是一个分段错误。

如果您想要了解有关此读数的更大图片,请按值传递参数并通过引用传递,它也适用于返回参数。

如你所说:

您可以使用结构返回多个数据项,但使用指针(我不明白这一点)将更有效地使用内存。 它是否正确?

让我们说你有一些结构:

struct BigStructure{
       int array[1000];
       double otherData[1000];
       //... etc
};

和一些方法:

BigStructure workWhenCopying(BigStructure bigStruct){
      // some work with a structure
      return bigStruct;
}

此方法说明了将参数传递给方法并按值返回时的情况,这意味着每次调用此方法时,都会将方法的参数复制到内存中的其他位置。 这种复制需要时间,当你有更大的结构时,它会减慢你的程序运行时间,因此通过引用传递大型结构会更有效。

void workWithReference(BigStructure & bigStruct){
     // do some work
}

在这种情况下,您不是复制整个数据结构,只是传递此结构所在的内存地址。 您也不需要返回语句,因为在此方法之外可以看到对该结构对象的更改。 但是,如果您将bigStruct重新分配给新的内存位置,它将仅在本地方法中可见: workWithReference

我希望现在更清楚了;)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM