为什么我的数组以不正确的大小传递?[复制]

Why is my array being passed with an incorrect size? [duplicate]

提问人:abdcg 提问时间:5/20/2020 最后编辑:Vlad from Moscowabdcg 更新时间:5/20/2020 访问量:421

问:

我刚刚开始学习C++,我正在玩函数。我正在尝试传递一个整数数组作为参数,并让函数打印数组的每个元素。然而,我的问题是我有一个初始化为 10 的数组,但是当我将其传递给函数时,它只将其读取为 2 的大小。任何帮助将不胜感激!您可以在下面找到我的程序。

#include <iostream>
#include <cmath>

using namespace std;

void Max(int Arr[])
{
    for (int i=0; i<sizeof(Arr)/sizeof(Arr[0]); i++)
    {
        cout<< Arr[i]<<endl;
    }
}


int main()
{
    int Arr[]={1,2,3,4,5,6,7,8,9,10};

    Max(Arr);

    return 0;
} 

提前感谢大家的帮助!

C++ 数组 引用 转换 按值传递

评论

0赞 abdcg 5/20/2020
是的,但现在我在使用 std::vector<int 时收到错误> Arr={1,2,3,4,5,6,7,8,9,10};而不是我已经拥有的。它说“未定义模板'std::__1::vector<int,std::__1::allocator<int> >'的mplicit实例化”
1赞 Jan Christoph Terasa 5/20/2020
Arr衰减为指针,因此编译器会将其计算为 。sizeof(int*)

答:

1赞 Vlad from Moscow 5/20/2020 #1

当数组按值传递时,它将隐式转换为指向其第一个元素的指针。

另一方面,编译器将声明为具有数组类型的函数参数调整为指向数组元素类型的指针。

例如,这些函数声明

void Max(int Arr[]);
void Max(int Arr[1])
void Max(int Arr[10])
void Max(int Arr[100]);

声明相同的函数,并由编译器调整为声明

void Max( int *Arr );

因此,在函数中,参数 Arr 是一个指针,这个表达式

sizeof(Arr)/sizeof(Arr[0])

相当于

sizeof( int * ) / sizeof( int )

生成 1 或 2,具体取决于类型的大小。int *

当您按值将数组传递给函数时,还应该显式传递其大小。

所以函数可以定义如下

void Max( const int Arr[], size_t n )
{
    for ( size_t i = 0; i < n; i++ )
    {
        cout << Arr[i] << endl;
    }
}

该函数可以像这样调用

Max(Arr, sizeof( Arr ) / sizeof( *Arr ) );

另一种方法是将函数参数声明为具有引用类型。在这种情况下,最好使用模板函数,至少可以为任何大小的数组调用它。

template <size_t N>
void Max( const int ( &Arr )[N] )
{
    for ( size_t i = 0; i < N; i++ )
    {
        cout << Arr[i] << endl;
    }
}

或者函数可以定义如下

template <typename T, size_t N>
void Max( const T ( &Arr )[N] )
{
    for ( size_t i = 0; i < N; i++ )
    {
        cout << Arr[i] << endl;
    }
}

这两个函数可以这样调用

Max(Arr);

请注意,您可以使用标头中声明的标准类模板。例如std::array<array>

#include <iostream>
#include <array>

const size_t N = 10;

std::ostream & Max( const std::array<int, N> &a, std::ostream &os = std::cout )
{
    for ( const auto &item : a )
    {
        os << item << ' ';
    }

    return os;
}


int main()
{
    std::array<int, N> a = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

    Max( a ) << '\n';

    return 0;
} 

程序输出为

1 2 3 4 5 6 7 8 9 10 

评论

1赞 Jan Christoph Terasa 5/20/2020
使用 、 或 .std::vectorstd::liststd::deque
0赞 Vlad from Moscow 5/20/2020
@JanChristophTerasa 如果您只需要一个数组,则没有任何理由使用例如 std::vector 或 std::list。
0赞 Jan Christoph Terasa 5/20/2020
你是对的,也会起作用。我只是反对为不同大小的数组提供数百个(模板)函数。std::array
1赞 Vlad 5/20/2020 #2

void Max(int Arr[])等于 。
在函数中: =
在 x64 上等于 2,在 x86 上等于 1

更正您的代码:
void Max(int* Arr)Max(int Arr[])sizeof(Arr)/sizeof(Arr[0])sizeof(int*)/sizeof(int)
---------------------------------

    #include <iostream>
    #include <cmath>

    using namespace std;

    void Max(int Arr[], int len)
    {
        for (int i=0; i<len; i++)
        {
            cout<< Arr[i]<<endl;
        }
    }


    int main()
    {
        int Arr[]={1,2,3,4,5,6,7,8,9,10};

        Max(Arr, sizeof(Arr)/sizeof(Arr[0]));

        return 0;
    }