如何获取传递给函数的数组的长度?
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)`;
给出以下函数:
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)`;