【问题标题】:Passing array as function parameter in C++ [duplicate]在C ++中将数组作为函数参数传递[重复]
【发布时间】:2023-03-03 04:37:02
【问题描述】:

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

#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);


}

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

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

【问题讨论】:

  • n = sizeof(a) / sizeof(int) 不会像您认为的那样做。您需要传入 N 或使用非类型模板参数。
  • 顺便说一句,如果您启用了合理的警告级别,您的编译器会告诉您问题:coliru.stacked-crooked.com/a/309fb24cde22a907
  • 没有调试工作。否决/关闭投票。
  • 我意识到这个问题可能是学术问题,但您也可以为此使用std::minmax_element 并完全保护该功能。 See it live.
  • 谢谢大家,但是一连串的反对票是不值得的。

标签: c++ arrays stl


【解决方案1】:

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

n = sizeof(a) / sizeof(int)

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

由于您没有使用动态数组,您可以使用std::array,它会记住它的大小。

你也可以使用:

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

【讨论】:

  • 不,你没有传递数组。你正在传递一个指针。见my answer
【解决方案2】:

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

在此声明中:

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

尽管a 似乎被定义为一个数组,但声明被“调整”为指向元素类型的指针,所以上面的真正意思是:

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

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

int arr[10];
problem1(arr);

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

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2011-04-07
        • 2013-07-24
        • 2017-02-12
        • 2010-10-01
        • 2017-01-08
        • 2016-06-12
        • 1970-01-01
        相关资源
        最近更新 更多