【问题标题】:C++ - passing an array of unknown size [duplicate]C ++ - 传递未知大小的数组[重复]
【发布时间】:2014-02-22 01:28:56
【问题描述】:

尝试传递一个从 1 开始的连续数字的 int 数组,但假设接收该数组的函数不知道它的长度。当试图计算函数内部的长度时,它只给我 1,因为它在计算 sizeof(arrayName) 时只找到第一个元素。

#include <iostream>
using namespace std;

int Sum(int intArray[]) {
    int n = sizeof(intArray) / sizeof(*intArray);
    cout << "Array size in function: " << n << endl;
    return n * (n + 1) / 2;
}

int main() {
    int anArray[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int arraySum = Sum(anArray);

    cout << "Array size in main: " << sizeof(anArray) / sizeof(*anArray) << endl;
    cout << "Sum is: " << arraySum;
    int a;
    cin >> a;
    return 0;
}

【问题讨论】:

标签: c++ arrays pointers


【解决方案1】:

您的函数正在获取指向 int 的指针。当您将数组传递给指针时,所有大小信息都会丢失。但是您可以使用函数模板来实例化匹配正确数组大小的函数:

template <size_t N>
int Sum(const int (&intArray)[N])
{
  cout << "Array size in function: " << N << endl;
  return std::accumulate(std::begin(intArray), std::end(intArray), 0);
}

这个Sum 函数将接受普通数组或编译时已知的大小。但是,在这些情况下使用 std::array 或在运行时选择大小的情况下使用 std::vector 更有意义。

请注意,对std::accumulate 的调用只是解决求和问题的一个示例。它不需要N 的知识,并且可以完全替换该功能。大小由std::beginstd::end 处理。 accumulatebegin/end 分别需要标头 &lt;numeric&gt;&lt;iterator&gt;

【讨论】:

  • +1,恕我直言,使用迭代器对更“sense”。等一下。那是std::accumulate。纳米=P
  • 谢谢,传递一个以 1 开头的连续数组然后返回 N * (N+1) / 2 但不能使用累积返回来编译它?错误说这 3 个不是 std 的成员
  • @Instinct #include &lt;numeric&gt;#include &lt;iterator&gt;
  • hhmm 与那些包括它仍然告诉我累积/存在/结束不是 std o_O 的成员
  • @Instinct It works for me.
【解决方案2】:

在这个函数声明中

int Sum(int intArray[]);

作为参数传递给它的数组被隐式转换为指向数组第一个元素的指针。所以这个声明等价于

int Sum( int *intArray );

还有表达式

int n = sizeof(intArray) / sizeof(*intArray );

等价于

int n = sizeof( int * ) / sizeof( int );

如果 sizeof( int * ) 等于 sizeof( int ) 则 n 将等于 1。

如果您以这种方式声明参数,那么您还应该声明第二个参数,该参数将接受数组中元素的数量。所以我会用以下方式重写函数

int Sum( int intArray[], size_t n ) 
{
    int sum = 0;

    for ( size_t i = 0; i < n; i++ ) sum += intArray[i];

    return sum;
}

在 main 中,我会按以下方式调用该函数

int arraySum = Sum( anArray, sizeof( anArray ) / sizeof( *anArray ) );

}

通常还编写函数来执行一些通用算法。只为具有从 1 到某个 N 的连续值的数组编写函数是一个坏主意。

【讨论】:

    猜你喜欢
    • 2021-08-05
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 2014-04-13
    • 1970-01-01
    • 2020-04-11
    相关资源
    最近更新 更多