如何获取传递给函数的数组的长度?

How can I get the length of an array that was passed to a function?

给出以下函数:

template<class T>
void foo(T* ar)
{
    std::cout << sizeof(ar) / sizeof(ar[0]) << std::endl;
    for (int i = 0; i < 6; i++)
        std::cout << ar[i] << " ";
}

以及以下数组:

int ar[] = { 5, 1, 6, 8, 9, 3 };
foo(ar);

我希望程序先打印“6”,然后再打印数组的内容。但出于某种原因,sizeof(ar) / sizeof(ar[0]) 的计算结果为 1(因为 sizeof(ar)sizeof(ar[0]) 的计算结果为“4”),但打印效果很好(这意味着传递的数组确实包含所有 6 个元素)。

这只发生在传递给函数的数组中(我尝试在 main() 中评估长度,数组在此处声明并且工作正常)。如何在函数中获取数组的长度?

只需将参数声明为具有引用类型。

例如

template<class T>
void foo( const T &ar )
{
    size_t n = sizeof(ar) / sizeof(ar[0]);
    std::cout << n << std::endl;
    for (int i = 0; i < n; i++)
        std::cout << ar[i] << " ";
}

或者您可以使用以下声明

template<class T, size_t N>
void foo( const T ( &ar )[N] )
{
    std::cout << N << std::endl;
    for (int i = 0; i < N; i++)
        std::cout << ar[i] << " ";
}

否则函数处理指针。在这种情况下,您需要指定第二个参数来表示数组的长度,如

template<class T>
void foo( const T* ar, size_t n )
{
    std::cout << n << std::endl;
    for (int i = 0; i < n; i++)
        std::cout << ar[i] << " ";
}

由于传递的数组在函数中没有改变,因此相应的参数应该有限定符 const.

注意在C++ 17 Standard中引入了标准函数std::size声明在头文件<iterator>中可以使用 而不是表达式 sizeof(ar) / sizeof(ar[0])

因此您可以在第一个显示的函数中编写示例

size_t n = std::size(ar)`;