在C ++中将数组作为函数参数传递

时间:2015-07-10 17:34:34

标签: c++ arrays stl

我知道数组可以通过很多方式传递给函数。

#include <iostream>
#include <utility>

using namespace std;

pair<int, int> problem1(int a[]);

int main()
{
    int a[] = { 10, 7, 3, 5, 8, 2, 9 };
    pair<int, int> p = problem1(a); 
    cout << "Max =" << p.first << endl;
    cout << "Min =" << p.second << endl;
    getchar();
    return 0;
}

pair<int,int> problem1(int a[])
{
    int max = a[0], min = a[0], n = sizeof(a) / sizeof(int);

    for (int i = 1; i < n; i++)
    {
        if (a[i]>max)
        {
            max = a[i];
        }
        if (a[i] < min)
        {
            min = a[i];
        }

    }

    return make_pair(max,min);


}

上面的代码只传递了第一个元素,而它应该传递一个数组(或者技术上,指向数组的指针)因此,输出为10,10为max和min(即仅为[0])

我做错了什么,我猜这是正确的方法。

4 个答案:

答案 0 :(得分:5)

数组的内容正在传递给函数。问题是:

n = sizeof(a) / sizeof(int)

不会给你数组的大小。将数组传递给函数后,您无法再次获得其大小。

由于您没有使用动态数组,因此您可以使用std::array来记住其大小。

你也可以使用:

template <int N>
void problem1(int (&a) [N]) 
{
    int size = N;
    //...
}

答案 1 :(得分:4)

不,你只是不能在C或C ++中将数组作为参数传递,至少不能直接传递。

在此声明中:

pair<int, int> problem1(int a[]);

即使a似乎被定义为数组,声明也会“调整”为指向元素类型的指针,所以上面的确意味着:

pair<int, int> problem1(int* a);

此外,在大多数情况下,数组类型的表达式被隐式转换为指向数组初始元素的指针。 (例外包括数组作为sizeof或一元&的操作数)。所以在调用上面的函数时:

int arr[10];
problem1(arr);

数组表达式arr等同于&arr[0],并且该地址(指针值)是传递给函数的内容。

当然,您可以编写与传递数组相同的代码。您可以使数组成为结构的成员(但必须具有固定长度)。或者,您可以将指针传递给初始元素,并且传递一个包含数组对象实际长度的单独参数。

或者您可以使用其中一个实现类数据结构的C ++标准库类;然后可以直接从参数中获取长度。

我强烈建议阅读comp.lang.c FAQ的第6节,其中包含数组和指针。它也适用于C ++(虽然它没有提到C ++标准库)。

答案 2 :(得分:0)

在C ++语言中,声明为int a[]的函数参数会立即解释为并且等同于int *a参数。这意味着您没有将数组传递给您的函数。您正在将指针传递给数组的第一个元素。

尝试将sizeof(a) / sizeof(int)技术应用于指针是没用的。它不可能产生论证arraay的大小。

答案 3 :(得分:0)

还没有提到的一个替代方法是将代码编写为模板,并通过引用传递数组,以便模板可以推断出数组的大小:

template <class T, size_t n>
pair<T, T> problem1(T(&a)[n]) {
    T max = a[0], min = a[0];

    for (size_t i = 1; i < n; i++) {
        if (a[i]>max) {
            max = a[i];
        }
        if (a[i] < min) {
            min = a[i];
        }
    }
    return make_pair(max, min);
}

但是,请注意,如果传递的是实数数组,而不是指针,则会有效。例如,代码如下:

int *b = new int[10];

for (int i = 0; i < 10; i++)
    b[i] = rand();

auto result = problem1(b);

...根本没有编译(因为我们已定义problem1来接收对数组的引用,而b是指针,而不是数组)。