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

Passing array as function parameter in C++

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

#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(即 a[0]仅)。

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

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

n = sizeof(a) / sizeof(int)

不给你数组的大小。一旦将数组传递给函数,就无法再次获取其大小。

因为您没有使用动态数组,所以您可以使用 std::array 来记住它的大小。

您还可以使用:

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

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

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

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

在此声明中:

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

虽然a看似被定义为数组,但声明是"adjusted"指向元素类型的指针,所以上面的真正意思是:

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

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

int arr[10];
problem1(arr);

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

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

或者您可以使用实现类数组数据结构的 C++ 标准库之一 类;那么长度可以直接从参数中取。

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

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

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 是一个指针,而不是数组)。