我知道数组可以通过很多方式传递给函数。
#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])
我做错了什么,我猜这是正确的方法。
答案 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
是指针,而不是数组)。