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

2023-12-02

给定以下函数:

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) and 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)`;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何获取传递给函数的数组的长度? 的相关文章

随机推荐