在 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
是一个指针,而不是数组)。
我知道可以通过多种方式将数组传递给函数。
#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
是一个指针,而不是数组)。