C++ 将数组作为函数参数传递到C++;
我知道数组可以通过多种方式传递给函数C++ 将数组作为函数参数传递到C++;,c++,arrays,stl,C++,Arrays,Stl,我知道数组可以通过多种方式传递给函数 #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 << "M
#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);
}
#包括
#包括
使用名称空间std;
配对问题1(int a[]);
int main()
{
INTA[]={10,7,3,5,8,2,9};
对p=问题1(a);
cout数组的内容正在传递给函数。问题是:
n = sizeof(a) / sizeof(int)
不提供数组的大小。一旦将数组传递给函数,就无法再次获取其大小
因为您不使用动态数组,所以可以使用一个能够记住其大小的数组
您还可以使用:
template <int N>
void problem1(int (&a) [N])
{
int size = N;
//...
}
模板
无效问题1(整型(&a)[N])
{
int size=N;
//...
}
在C++语言中,一个声明为int []]/CODE的函数参数立即被解释为等同于int *< /Cux>参数。这意味着,您没有将数组传递给函数。
尝试将<代码>(a)/siZeof(int)< /C> >技术应用于指针是无用的。它不可能产生参数ARRAY。 < P>不,您不能将数组作为C或C++中的参数传递,至少不能直接传递。
在本宣言中:
pair<int, int> problem1(int a[]);
此外,在大多数上下文中,数组类型的表达式隐式转换为指向数组初始元素的指针。(例外情况包括作为sizeof
或一元&
操作数的数组)。因此在调用上述函数时:
int arr[10];
problem1(arr);
数组表达式arr
相当于&arr[0]
,该地址(指针值)就是传递给函数的地址
当然,您可以编写与传递数组等效的代码。您可以使数组成为结构的成员(但必须是固定长度的)。或者您可以传递指向初始元素的指针,并传递包含数组对象实际长度的单独参数
或者可以使用C++实现的一个标准类库类来实现数组类数据结构,然后可以直接从参数中获取长度。
我高度推荐了包含数组和指针的阅读部分6。它也适用于C++(虽然它没有提到C++标准库)。
< P>一个没有提到的替代方法是将代码编写为模板,并通过引用传递数组,这样模板可以推断数组的大小:
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);
}
模板
配对问题1(T&a)[n]){
T max=a[0],min=a[0];
对于(大小i=1;imax){
max=a[i];
}
if(a[i]
但是,请注意,这仅在传递真实数组而不是指针时才有效。例如,下面的代码:
int *b = new int[10];
for (int i = 0; i < 10; i++)
b[i] = rand();
auto result = problem1(b);
int*b=新的int[10];
对于(int i=0;i<10;i++)
b[i]=rand();
自动结果=问题1(b);
…根本不会编译(因为我们定义了problem1
来接收对数组的引用,而b
是指针,而不是数组)。n=sizeof(a)/sizeof(int)
不会像你想象的那样做。你需要传入N或使用非类型模板参数。顺便说一句,如果你启用了合理的警告级别:没有调试工作,编译器会告诉你这个问题。向下/关闭投票。我知道这个问题可能是学术性的,但你也可以使用它并确保函数的正确性irely..谢谢大家,但是一连串的否决票是不应该的。不,你没有通过数组。你在传递指针。看。
int *b = new int[10];
for (int i = 0; i < 10; i++)
b[i] = rand();
auto result = problem1(b);