Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将数组作为函数参数传递到C++;_C++_Arrays_Stl - Fatal编程技术网

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);