为什么我的数组传递的大小不正确?
Why is my array being passed with an incorrect size?
我刚开始学习 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 )
根据类型的大小生成 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);
请注意,您可以使用 header <array>
中声明的标准 class 模板 std::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
void Max(int Arr[])
等于 void Max(int* Arr)
。
在函数中 Max(int Arr[])
:
sizeof(Arr)/sizeof(Arr[0])
= sizeof(int*)/sizeof(int)
在 x64 上它等于 2,在 x86 上它等于 1
更正您的代码:
--------------------------------
#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;
}
我刚开始学习 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 )
根据类型的大小生成 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);
请注意,您可以使用 header <array>
中声明的标准 class 模板 std::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
void Max(int Arr[])
等于 void Max(int* Arr)
。
在函数中 Max(int Arr[])
:
sizeof(Arr)/sizeof(Arr[0])
= sizeof(int*)/sizeof(int)
在 x64 上它等于 2,在 x86 上它等于 1
更正您的代码:
--------------------------------
#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;
}