Size of an array C++ [duplicate] (7个答案)
7个月前关闭。
我刚开始学习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;
}
谢谢大家的帮助!
当数组按值传递时,它将隐式转换为指向其第一个元素的指针。
另一方面,编译器会将声明为具有数组类型的函数参数调整为指向数组元素类型的指针。
因此,例如,这些函数声明
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 )
根据
int *
类型的大小产生1或2。
当按值将数组传递给函数时,还应该显式传递其大小。
所以功能可以这样定义
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);
请注意,可以使用 header
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