尝试传递一个以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;
}
答案 0 :(得分:8)
你的函数正在指向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::begin
和std::end
处理。您需要分别为<numeric>
和<iterator>
添加标题accumulate
和begin/end
。
答案 1 :(得分: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的sequantial值的数组编写函数是一个坏主意。